package rhplus.gestor;

import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.LinkedList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import rhplus.persistencia.ContaDeUtilizador;
import rhplus.persistencia.Hospital;
import rhplus.servico.Consulta;
import rhplus.servico.Servico;
import rhplus.utilizador.ClienteParticular;
import rhplus.utilizador.Colaborador;
import rhplus.utilizador.MembroDoAgregado;
import rhplus.utilizador.Pessoa;

@SuppressWarnings("serial")
public class GestorDeServicos extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */

    public GestorDeServicos() {
        super();
    }

    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String accao = (String) request.getParameter("accao");

        if (accao.equals(GestorDeServicos.MARCAR_CONSULTA)) {
            marcarConsulta(request, response, session);
        } else if (accao.equals(GestorDeServicos.MARCAR_FALTA_DE_COMPARENCIA_DE_CONSULTA)) {
            marcarFaltaDeComparenciaDeConsulta(request, response, session);
        } else if (accao.equals(GestorDeServicos.SOLICITAR_INTERNAMENTO)) {
            solicitaInternamento(request, response, session);
        } else if (accao.equals(GestorDeServicos.ALTERAR_INTERNAMENTO)) {
            alteraInternamento(request, response, session);
        } else if (accao.equals(GestorDeServicos.MARCAR_COMPARENCIA_DE_CONSULTA)) {
            marcarComparenciaDeConsulta(request, response, session);
        } else if (accao.equals(GestorDeServicos.CANCELAR_CONSULTAS)) {
            cancelarConsulta(request, response, session);
        } else if (accao.equals(GestorDeServicos.PAGAR_SERVICO)) {
            pagarServico(request, response, session);
        } else if (accao.equals(GestorDeServicos.EMITIR_FACTURA)) {
            emitirFactura(request, response, session);
        } else if (accao.equals(GestorDeServicos.VISUALIZAR_CONSULTAS)) {
            visualizarConsultas(request, response, session);
        } else if (accao.equals(GestorDeServicos.VISUALIZAR_HISTORIAL_MEDICO)) {
            visualizarHistorialMedico(request, response, session);
        } else if (accao.equals(GestorDeServicos.VISUALIZAR_FICHA_MEDICA)) {
            visualizarFichaMedica(request, response, session);
        } else if (accao.equals(GestorDeServicos.VISUALIZAR_CONSULTAS_DO_COLABORADOR)) {
            visualizarConsultasDoColaborador(request, response, session);
        } else if (accao.equals(GestorDeServicos.INSERIR_FICHA_MEDICA)) {
            inserirFichaMedica(request, response, session);
        } else if (accao.equals(GestorDeServicos.ALTERAR_FICHA_MEDICA)) {
            alterarFichaMedica(request, response, session);
        } else if (accao.equals(GestorDeServicos.EXAMES_MARCADOS)) {
            visualizarExames(request, response, session);
        } /*else if (accao.equals(GestorDeServicos.MARCAR_EXAME_MEDICO)) {
            marcarExameMedico(request, response, session);
        } else if (accao.equals(GestorDeServicos.MARCAR_EXAME)) {
            marcarExame(request, response, session);
        }*/ else {
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            System.out.print("tou akiiiiii");
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

//    public void marcarExameMedico(HttpServletRequest request, HttpServletResponse response, HttpSession session)
//            throws IOException {
//
//        try {
//            String sub_accao = (String) request.getParameter("sub_accao");
//
//            if (sub_accao != null && sub_accao.equals("primeira")) {
//
//                Long id_medico = Long.parseLong(request.getParameter("id_medico"));
////                      session.setAttribute("id_medico", id_medico);
//
//                String id_utente = request.getParameter("id_utente");
////                    session.setAttribute("id_utente", id_utente);
//
//                Long id_consulta = Long.parseLong(request.getParameter("id").toString());
//                session.setAttribute("id_consulta", id_consulta);
//
//
//                LinkedList<String> especialidades = ServicoGenerico.devolveEspecialidades();
//
//                session.setAttribute("especialidades", especialidades);
//                session.setAttribute("id_utente", request.getParameter("id_utente"));
//                session.setAttribute("id_medico", request.getParameter("id_medico"));
//
//                response.sendRedirect("/marcar_exame_medico.jsp");
//
//
//            } else if (sub_accao != null && sub_accao.equals("segunda")) {
//                String id_utente = session.getAttribute("id_utente").toString();
//
//                Hashtable<String, Object> dados_do_servico = populaTabelaMarcarExame(request, session);
//                //   Servico.insereServicoExame(dados_do_servico);
//
//                //Long id_exame = Servico.devolveUltimoIdentificadorDeInsercao();
//
//
//                Hashtable<String, Object> dados_do_exame = populaTabelaConsultaExame(request, session);
//                //  dados_do_exame.put("var_id_exame", id_exame);
//                // Servico.insereConsultaExame(dados_do_exame);
//
//                session.setAttribute("msg_sucesso", "Exame marcado com sucesso.");
//                session.setAttribute("nome_pagina_link", "dos exames");
//                session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=exames_marcados&sub_accao=primeira&id=" + session.getAttribute("id_consulta") + "&id_colaborador=" + session.getAttribute("id_medico") + "&id_utente=" + id_utente);
//                response.sendRedirect("/mostra_sucesso.jsp");
//
//            }
//
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//            /**  } catch ( IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");**/
//            //  }
//        }
//
//    }

//    public void marcarExame(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//
//            session.setAttribute("id_hospital", request.getParameter("id_hospital"));
//            session.setAttribute("especialidade", request.getParameter("especialidade"));
//            session.setAttribute("id_medico", request.getParameter("id_medico"));
//
//            session.setAttribute("dia", request.getParameter("dia"));
//            session.setAttribute("hora", request.getParameter("hora"));
//
//            String sub_accao = (String) request.getParameter("sub_accao");
//
//            if (sub_accao != null && sub_accao.equals("primeira")) {
//
//                session.setAttribute("id_servico", request.getParameter("id_consulta"));
//                Long id_consulta = Long.parseLong(request.getParameter("id_consulta"));
//
//                session.setAttribute("id_hospital", request.getParameter("id_hospital"));
//
//                Servico servico = Servico.devolve(id_consulta);
//
////                session.setAttribute("utente", servico.getUtente().getNome());
//                //  session.setAttribute("especialidade", servico.getServicoGenerico().getEspecialidade());
//
//                //   LinkedList<Hospital> lista_hospitais = Hospital.devolveHospitalPorEspecialidade(servico.getServicoGenerico().getEspecialidade());
////                session.setAttribute("lista_hospitais", lista_hospitais);
//
//                session.setAttribute("passo", "primeiro");
//                session.removeAttribute("hospital");
//
//                response.sendRedirect("/marcar_exame.jsp");
//
//                // SEGUNDA OPCAO
//            } else if (sub_accao != null && sub_accao.equals("segunda")) {
//
//                Servico servico = Servico.devolve(Long.parseLong(session.getAttribute("id_servico").toString()));
//
//                Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));
//                Hospital hospital = Hospital.devolve(id_hospital);
//
//                //     LinkedList<Colaborador> medicos = Hospital.devolveMedicosDaEspecialidade(hospital.getIdHospital(), servico.getServicoGenerico().getEspecialidade());
//
//                LinkedList<Pessoa> nova = new LinkedList<Pessoa>();
//
//                for(Colaborador m : medicos){
//                    nova.add(Pessoa.devolve(m.getIdPessoa()));
//                }
//
//                //session.setAttribute("medicos", medicos);
//                session.setAttribute("medicos", nova);
//                session.removeAttribute("medico");
//                session.setAttribute("passo", "segundo");
//                session.setAttribute("hospital", Hospital.devolve(Long.parseLong(request.getParameter("id_hospital"))));
//
//                response.sendRedirect("/marcar_exame.jsp");
//
//                // TERCEIRA OPCAO
//            } else if (sub_accao != null && sub_accao.equals("terceira")) {
//
//                organizaLinksParaCalendario(request, session);
//
//                Long id_medico = Long.parseLong((String) request.getParameter("id_medico"));
//
//                session.setAttribute("servicos", Servico.devolveTodosOsActivosDoColaborador(id_medico));
//                session.setAttribute("passo", "terceiro");
//                session.setAttribute("medico", Colaborador.devolvePorIdPessoa(Long.parseLong(request.getParameter("id_medico"))));
//
//                session.setAttribute("dados_medico", Pessoa.devolve(Long.parseLong(request.getParameter("id_medico"))));
//
//                response.sendRedirect("/marcar_exame.jsp");
//
//                // QUARTA OPCAO
//            } else if (sub_accao != null && sub_accao.equals("quarta")) {
//                int dia = Integer.parseInt((String) request.getParameter("dia"));
//
//                Date data_actual = (Date) session.getAttribute("data_actual");
//                @SuppressWarnings("unchecked")
//                LinkedList<Servico> servicos = (LinkedList<Servico>) session.getAttribute("servicos");
//
//                LinkedList<Servico> servicos_do_dia = new LinkedList<Servico>();
//                for (Servico servico_dia : servicos) {
//                    if (Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(servico_dia.getData())) == Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_actual))
//                            && Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(servico_dia.getData())) - 1 == (Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual))) && Integer.parseInt(UtensiliosParaDatas.devolveDiaDaData(servico_dia.getData())) == dia) {
//                        servicos_do_dia.add(servico_dia);
//                    }
//                }
//
//                session.setAttribute("servicos_do_dia", servicos_do_dia);
//
//                Long id_medico = Long.parseLong((String) request.getParameter("id_medico"));
//
//                Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));
//                String horario_de_trabalho = Colaborador.devolvePorIdPessoa(id_medico).getHorarioTrabalhoParaHospital(id_hospital);
//
//                session.setAttribute("horario_de_trabalho", horario_de_trabalho);
//                session.setAttribute("passo", "quarto");
//
//                response.sendRedirect("/marcar_exame.jsp");
//
//                // QUINTA OPCAO
//            } else if (sub_accao != null && sub_accao.equals("quinta")) {
//
//             //   Exame dados_do_exame = populaTabelaMarcarExameUtente(request, session);
//
//               // Exame.alteraExame(dados_do_exame);
//             //   Servico servico = Servico.devolve(Long.parseLong(session.getAttribute("id_servico").toString()));
//
//                //   Long id_utente = servico.getUtente().getIdPessoa();
//
//                session.setAttribute("msg_sucesso", "Exame marcado com sucesso.");
//                session.setAttribute("nome_pagina_link", "das consultas");
//                //session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas&sub_accao=primeira&id=" + id_utente);
//                response.sendRedirect("/mostra_sucesso.jsp");
//
//            }
//
//        } catch (Exception e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
//    }

    public void marcarConsulta(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            if (dadosEstaoValidos(request, GestorDeServicos.MARCAR_CONSULTA)) {
                // Remove atributo de sessao
                session.removeAttribute("erros");

                session.setAttribute("id_hospital", request.getParameter("id_hospital"));
                session.setAttribute("especialidade", request.getParameter("especialidade"));
                session.setAttribute("id_medico", request.getParameter("id_medico"));

                session.setAttribute("dia", request.getParameter("dia"));
                session.setAttribute("hora", request.getParameter("hora"));

                String sub_accao = (String) request.getParameter("sub_accao");

                if (sub_accao != null && sub_accao.equals("primeira")) {
                    Long id_utente = Long.parseLong(request.getParameter("id_utente"));
                    LinkedList<Hospital> hospitais = Hospital.devolveTodos();
                    session.setAttribute("hospitais", hospitais);
                    session.setAttribute("id_utente", request.getParameter("id_utente"));

                    session.setAttribute("passo", "primeiro");
                    session.removeAttribute("hospital");

                    session.setAttribute("lista_membros", MembroDoAgregado.devolveTodosDoCliente(id_utente));

                    response.sendRedirect("/marcarConsulta.jsp");
                } else if (sub_accao != null && sub_accao.equals("segunda")) {
                    String id_pessoa = (String) request.getParameter("id_pessoa");
                    session.setAttribute("id_pessoa_selecionada", id_pessoa);

                    LinkedList<String> especialidades = Hospital.lista_especialidades();

                    session.setAttribute("especialidades", especialidades);

                    session.setAttribute("passo", "segundo");

                    // Mostra (novo)
                    session.setAttribute("hospital", Hospital.devolve(Long.parseLong(request.getParameter("id_hospital"))));

                    response.sendRedirect("/marcarConsulta.jsp");
                } else if (sub_accao != null && sub_accao.equals("terceira")) {
                    Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));

                    LinkedList<Colaborador> medicos = Hospital.devolveMedicosDaEspecialidade(id_hospital, request.getParameter("especialidade"));
                    LinkedList<Pessoa> dados_medicos = new LinkedList<Pessoa>();

                    for (Colaborador c : medicos) {
                        dados_medicos.add(Pessoa.devolve(c.getIdPessoa()));
                    }

                    session.setAttribute("dados_medicos", dados_medicos);
                    session.setAttribute("medicos", medicos);
                    session.removeAttribute("medico");

                    session.setAttribute("passo", "terceiro");

                    response.sendRedirect("/marcarConsulta.jsp");
                } else if (sub_accao != null && sub_accao.equals("quarta")) {
                    Long id_medico = Long.parseLong(request.getParameter("id_medico"));

                    organizaLinksParaCalendario(request, session);

                    session.setAttribute("servicos", Servico.devolveTodosOsActivosDoColaborador(id_medico));

                    session.setAttribute("passo", "quarto");

                    // Mostra (novo)
                    session.setAttribute("medico", Colaborador.devolvePorIdPessoa(Long.parseLong(request.getParameter("id_medico"))));

                    response.sendRedirect("/marcarConsulta.jsp");
                } else if (sub_accao != null && sub_accao.equals("quinta")) {
                    int dia = Integer.parseInt((String) request.getParameter("dia"));

                    Date data_actual = (Date) session.getAttribute("data_actual");
                    @SuppressWarnings("unchecked")
                    LinkedList<Servico> servicos = (LinkedList<Servico>) session.getAttribute("servicos");

                    LinkedList<Servico> servicos_do_dia = new LinkedList<Servico>();
                    for (Servico servico : servicos) {
                        if (Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(servico.getData())) == Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_actual)) && Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(servico.getData())) - 1 == (Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual))) && Integer.parseInt(UtensiliosParaDatas.devolveDiaDaData(servico.getData())) == dia) {
                            servicos_do_dia.add(servico);
                        }
                    }

                    session.setAttribute("servicos_do_dia", servicos_do_dia);

                    Long id_medico = Long.parseLong(request.getParameter("id_medico"));

                    Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));
                    String horario_de_trabalho = Colaborador.devolvePorIdPessoa(id_medico).getHorarioTrabalhoParaHospital(id_hospital);

                    session.setAttribute("horario_de_trabalho", horario_de_trabalho);

                    session.setAttribute("passo", "quinto");

                    response.sendRedirect("/marcarConsulta.jsp");
                } else if (sub_accao != null && sub_accao.equals("sexta")) {

                    Consulta dados_do_servico = populaTabelaMarcarConsulta(request, session);
                    Consulta.insere(dados_do_servico);

                    Long id_utente = Long.parseLong((String)session.getAttribute("id_utente"));
                    session.setAttribute("msg_sucesso", "Consulta marcada com sucesso.");
                    session.setAttribute("nome_pagina_link", "das consultas");
                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas&sub_accao=primeira&id=" + id_utente);
                    response.sendRedirect("/mostra_sucesso.jsp");
                  
                } else {
                    session.setAttribute("excepcao", "Url incorrecto.");
                    response.sendRedirect("/mostra_erro.jsp");
                }
            } else {
                Hashtable<String, String> erros = devolveTabelaDeErrosParaMarcarConsulta(request);
                session.setAttribute("erros", erros);

                if (erros.containsKey("id_hospital")) {
                    session.setAttribute("passo", "primeiro");
                    session.removeAttribute("especialidade");
                    session.removeAttribute("medico");
                    session.removeAttribute("dia");
                    session.removeAttribute("hora");
                } else if (erros.containsKey("especialidade")) {
                    session.setAttribute("passo", "segundo");
                    session.removeAttribute("medico");
                    session.removeAttribute("dia");
                    session.removeAttribute("hora");
                } else if (erros.containsKey("id_medico")) {
                    session.setAttribute("passo", "terceiro");
                    session.removeAttribute("dia");
                    session.removeAttribute("hora");
                } else if (erros.containsKey("especialidade")) {
                    session.setAttribute("dia", "quarto");
                    session.removeAttribute("hora");
                } else if (erros.containsKey("especialidade")) {
                    session.setAttribute("hora", "quinto");
                }

                response.sendRedirect("/marcarConsulta.jsp");
            }

        } catch (Exception e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    private void solicitaInternamento(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            if (dadosEstaoValidos(request, GestorDeServicos.SOLICITAR_INTERNAMENTO)) {
//                // Remove atributo de sessao
//                session.removeAttribute("erros");
//
//                //REVER ISTO
//                session.setAttribute("id_hospital", request.getParameter("id_hospital"));
//                session.setAttribute("tipo_de_internamento", request.getParameter("tipo_de_internamento"));
//                session.setAttribute("dia_inicio", request.getParameter("dia_inicio"));
//            
//                session.setAttribute("hora_entrada", request.getParameter("hora_entrada"));
////System.out.println("-----#######====== Hora entrada: " + request.getParameter("hora_entrada"));
//                session.setAttribute("hora_saida", request.getParameter("hora_saida"));
////System.out.println("-----#######====== Hora saida: " + request.getParameter("hora_saida"));
//              
//                session.setAttribute("dia_fim", request.getParameter("dia_fim"));
//                session.setAttribute("quarto_hospital", request.getParameter("quarto_hospital"));
//                session.setAttribute("cama_disponivel", request.getParameter("cama_disponivel"));
//
//                String sub_accao = (String) request.getParameter("sub_accao");
//                if (sub_accao != null && sub_accao.equals("primeira")) {
//
//                    Medico colaborador = (Medico) session.getAttribute("utilizador");
//                    int id_pessoa_do_colaborador = colaborador.getIdPessoa();
//
//                    Medico m = Medico.devolve(id_pessoa_do_colaborador);
//                    int id_hospital = m.getIdHospital();
//                    int id_hospital2 = m.getIdHospital2();
//
//                    LinkedList<Hospital> hospitais = Hospital.devolveTodos();
//                    LinkedList<Hospital> hospitais_final = new LinkedList<Hospital>();
//
//                    for( Hospital h : hospitais ) {
//                        if( h.getIdHospital() == id_hospital || h.getIdHospital() == id_hospital2 )
//                            hospitais_final.add(h);
//                    }
//
//                    session.setAttribute("hospitais", hospitais_final);
//                    //AQUI TEM DE SE COLOCAR O ID DO UTENTE PESQUISADO
//                    session.setAttribute("id_utente", request.getParameter("id_utente"));
//
//                    session.setAttribute("passo", "primeiro");
//                    session.removeAttribute("hospital");
//
//                 
//                    int id_utente = Integer.parseInt((String) session.getAttribute("id_utente_hahaha"));
////System.out.println("########### id_utente a pesquisar: " + id_utente + ". Remover lista_dias_indispo e pesquisar novamente.");
//session.removeAttribute("lista_dias_indisponiveis");
//                    session.setAttribute("lista_dias_indisponiveis", (LinkedList) Hospital.devolveDatasInternamentoIndisponiveis(id_utente));
//                  
//
//                    response.sendRedirect("/solicita_internamento.jsp");
//                } else if (sub_accao != null && sub_accao.equals("segunda")) {
//                    int id_hospital = Integer.parseInt(request.getParameter("id_hospital"));
//
//                    LinkedList<String> tipos_de_internamento = Hospital.devolveTiposDeInternamento(id_hospital);
//                    session.setAttribute("tipos_de_internamento", tipos_de_internamento);
//
//                    session.setAttribute("passo", "segundo");
//
//                    // Mostra (novo)
//                    session.setAttribute("hospital", Hospital.devolve(Integer.parseInt(request.getParameter("id_hospital"))));
//
//                    response.sendRedirect("/solicita_internamento.jsp");
//                } else if (sub_accao != null && sub_accao.equals("terceira")) {
//                    organizaLinksParaCalendario_entrada(request, session);
//
//                    session.setAttribute("passo", "terceiro");
//                    response.sendRedirect("/solicita_internamento.jsp");
//
//                } else if (sub_accao != null && sub_accao.equals("quarta")) {
//                    organizaLinksParaCalendario_saida(request, session);
//
//                    session.setAttribute("passo", "quarto");
//                    response.sendRedirect("/solicita_internamento.jsp");
//                } else if (sub_accao != null && sub_accao.equals("quinta")) {
//                    int id_hospital = Integer.parseInt(request.getParameter("id_hospital"));
//
//                    String id_tipo = (String) session.getAttribute("tipo_de_internamento");
//                    LinkedList<String> lista_id_internamento = Hospital.devolveIdInternamentoPorNome(id_tipo);
//                    int id_tipo_internamento = Integer.parseInt(lista_id_internamento.getFirst());
//
//                    LinkedList<String> quartos_hospital = Hospital.devolveTodosOsQuartosDoHospitalParaTipoInternamento(id_hospital, id_tipo_internamento);
//                    session.setAttribute("quartos_hospital", quartos_hospital);
//
//                    session.setAttribute("passo", "quinto");
//                    response.sendRedirect("/solicita_internamento.jsp");
//                } else if (sub_accao != null && sub_accao.equals("sexta")) {
//
//                    int numero_quarto = Integer.parseInt(request.getParameter("quarto_hospital"));
//                    Date data_entrada = (Date) session.getAttribute("data_actual_entrada");
//                    Date data_saida = (Date) session.getAttribute("data_actual_saida");
//
//                    //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
//                    int ano_entrada = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_entrada));
//                    int mes_entrada = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_entrada));
//                    int dia_entrada = Integer.parseInt((String) session.getAttribute("dia_inicio"));
//                    String nova_data_entrada = ("" + ano_entrada + "-" + (mes_entrada + 1) + "-" + dia_entrada + "");
//
//                    //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
//                    int ano_saida = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_saida));
//                    int mes_saida = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_saida));
//                    int dia_saida = Integer.parseInt((String) session.getAttribute("dia_fim"));
//                    String nova_data_saida = ("" + ano_saida + "-" + (mes_saida + 1) + "-" + dia_saida + "");
//
//                  
////System.out.println("nova_data_entrada: " + nova_data_entrada);
////System.out.println("nova_data_saida: " + nova_data_saida);
//                    int hora_entrada = Integer.parseInt( (String) session.getAttribute("hora_entrada") );
//                    int hora_saida = Integer.parseInt( (String) session.getAttribute("hora_saida") );
//                    LinkedList<String> camas_disponiveis = Hospital.devolveTodasAsCamasLivresDoQuarto(nova_data_entrada, nova_data_saida, hora_entrada, hora_saida, numero_quarto);
//                    session.setAttribute("camas_disponiveis", camas_disponiveis);
//                      
//                    if( camas_disponiveis.isEmpty() ) {
//
//                        Medico colaborador = (Medico) session.getAttribute("utilizador");
//                        int id_pessoa_do_colaborador = colaborador.getIdPessoa();
//
//                        String id_tipo = (String) session.getAttribute("tipo_de_internamento");
//                        LinkedList<String> lista_id_internamento = Hospital.devolveIdInternamentoPorNome(id_tipo);
//                        int id_tipo_internamento = Integer.parseInt(lista_id_internamento.getFirst());
//
//                        LinkedList<LinkedList> lista_quartos_com_camas_livres = Hospital.devolveQuartosComCamasLivresPorMedicoEEspecialidade( nova_data_entrada, nova_data_saida, hora_entrada, hora_saida, id_pessoa_do_colaborador, id_tipo_internamento );
//
//                        LinkedList<String> lista_quartos_hospital = new LinkedList<String>();
//                        LinkedList<String> lista_quartos_hospital2 = new LinkedList<String>();
//                        LinkedList<String> lista_nomes_hospitais = new LinkedList<String>();
//
//                        lista_quartos_hospital = lista_quartos_com_camas_livres.get(0);
//                        lista_quartos_hospital2 = lista_quartos_com_camas_livres.get(1);
//                        lista_nomes_hospitais = lista_quartos_com_camas_livres.get(2);
//
//                        String sugestao = "";
//
//                        if( lista_quartos_hospital.isEmpty() && lista_quartos_hospital2.isEmpty() ) { //se as duas sublistas que estao dentro da lista estao vazias, entao nao existem mais quartos com camas livres
//                            sugestao = "Para o internamento pretendido n�o existem camas disponiveis em nenhum quarto dos hospitais onde trabalha.";
//                        } else if( !lista_quartos_hospital.isEmpty() && lista_quartos_hospital2.isEmpty() ) { //se das duas sublistas que estao dentro da lista a segunda sublista esta vazia e a segunda nao, entao apenas existem quartos com camas livres para o 2� hospital
//                            sugestao = "Para este internamento, existem camas diponiveis no(s) quarto(s) ";
//                            for( String num_quarto : lista_quartos_hospital )
//                                sugestao += num_quarto + ", ";
//                            sugestao += "do hospital " + lista_nomes_hospitais.get(0) + ".";
//                        } else if( lista_quartos_hospital.isEmpty() && !lista_quartos_hospital2.isEmpty() ) { //se das duas sublistas que estao dentro da lista a primeira sublista esta vazia e a segunda nao, entao apenas existem quartos com camas livres para o 1� hospital
//                            sugestao = "Para este internamento, existem camas diponiveis no(s) quarto(s) ";
//                            for( String num_quarto : lista_quartos_hospital2 )
//                                sugestao += num_quarto + ", ";
//                            sugestao += "do hospital " + lista_nomes_hospitais.get(1) + ".";
//                        } else if( !lista_quartos_hospital.isEmpty() && !lista_quartos_hospital2.isEmpty() ){ //se as duas sublistas que estao dentro da lista nao estao vazias, entao existem quartos com camas livres em ambos os hospitais
//                            sugestao = "Para este internamento, existem camas diponiveis no(s) quarto(s) ";
//                            for( String num_quarto : lista_quartos_hospital )
//                                sugestao += num_quarto + ", ";
//                            sugestao += "do hospital " + lista_nomes_hospitais.get(0) + ".";
//
//                            sugestao += "Existem tamb�m camas diponiveis no(s) quarto(s) ";
//                            for( String num_quarto : lista_quartos_hospital2 )
//                                sugestao += num_quarto + ", ";
//                            sugestao += "do hospital " + lista_nomes_hospitais.get(1) + ".";
//                        }
//
//                        session.setAttribute("sugestao", sugestao );
//                    }
//                       
//
//                    session.setAttribute("passo", "sexto");
//                    response.sendRedirect("/solicita_internamento.jsp");
//                } else if (sub_accao != null && sub_accao.equals("setima")) {
//                    session.setAttribute("cama_escolhida", request.getParameter("cama_disponivel"));
//                    Hashtable<String, Object> dados_para_insercao = populaTabelaInternamentoCliente(request, session);
//                    Servico.insereInternamento(dados_para_insercao);
//
//                    //Pessoa � o utente
//                    Pessoa pessoa = (Pessoa) session.getAttribute("pessoa");
//                    int id_pessoa = pessoa.getIdPessoa();
//
//                   
//                    //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
//                    session.setAttribute("msg_sucesso", "Internamento marcado com sucesso.");
//                    session.setAttribute("nome_pagina_link", "dos dados do cliente");
//                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
//                    response.sendRedirect("/mostra_sucesso.jsp");
//                    //}Helio6
//
//                } else {
//                    session.setAttribute("excepcao", "Url incorrecto.");
//                    response.sendRedirect("/mostra_erro.jsp");
//                }
//            } else {
//                Hashtable<String, String> erros = devolveTabelaDeErrosSolicitarInternamento(request);
//                session.setAttribute("erros", erros);
//
//                if (erros.containsKey("id_hospital")) {
//
//                    session.setAttribute("passo", "primeiro");
//                    session.removeAttribute("tipos_de_internamento");
//                    session.removeAttribute("data_actual_entrada");
//                    session.removeAttribute("data_actual_saida");
//                    session.removeAttribute("quarto_hospital");
//                    session.removeAttribute("cama_disponivel");
//
//                } else if (erros.containsKey("tipo_de_internamento")) {
//
//                    session.setAttribute("passo", "segundo");
//                    session.removeAttribute("data_actual_entrada");
//                    session.removeAttribute("data_actual_saida");
//                    session.removeAttribute("quarto_hospital");
//                    session.removeAttribute("cama_disponivel");
//
//                } else if (erros.containsKey("dia_inicio")) {
//
//                    session.setAttribute("passo", "terceiro");
//                    session.removeAttribute("data_actual_saida");
//                    session.removeAttribute("quarto_hospital");
//                    session.removeAttribute("cama_disponivel");
//
//                } else if (erros.containsKey("dia_fim")) {
//
//                    session.setAttribute("passo", "quarto");
//                    session.removeAttribute("quarto_hospital");
//                    session.removeAttribute("cama_disponivel");
//
//                } else if (erros.containsKey("quarto_hospital")) {
//
//                    session.setAttribute("passo", "quinto");
//                    session.removeAttribute("cama_disponivel");
//
//                } else if (erros.containsKey("cama_disponivel")) {
//
//                    session.setAttribute("passo", "sexto");
//                }
//
//                response.sendRedirect("/solicita_internamento.jsp");
//            }
//
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    private void alteraInternamento(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//
//            String sub_accao = (String) request.getParameter("sub_accao");
//
//            if ( sub_accao != null && sub_accao.equals("primeira") ) {
//
//                int id_internamento = Integer.parseInt((String) request.getParameter("id_internamento"));
//                int id_pessoa = Integer.parseInt( (String) request.getParameter("id_pessoa") );
//
//                // Propaga dados, previamente inseridos, pela sessao
//                session.setAttribute("id_internamento", id_internamento);
//                session.setAttribute("id_pessoa", id_pessoa);
//
//                LinkedList dados_internamento = Hospital.devolveDadosInternamento( id_internamento );
//
//                //int ano = 2009;
//                //int mes = 4;
//                //int dia = 12;
//
//                //constru��o da data final
//                //Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);
//                //session.setAttribute("data_actual_saida", data);
//
//                /** SETS de ATTRIBUTTES TODO
//                * ---sessionid
//                * id_internamento
//                * id_pessoa
//                * ---erros
//                * ---passo
//                data_actual_saida
//                data_actual_entrada
//                dia_inicio
//                dia_fim
//                primeiro_mes_saida
//                primeiro_ano_saida
//                * mes_anterior_saida
//                * ano_anterior_saida
//                * mes_seguinte_saida
//                * ano_seguinte_saida
//                ultimo_mes_saida
//                ultimo_ano_saida
//                hora_saida
//                **/
//
//                Date data_actual_entrada = UtensiliosParaDatas.devolveDataEmDate( (String) dados_internamento.get(0) );
//                session.setAttribute("data_actual_entrada", data_actual_entrada );
//
//                session.setAttribute("data_existente_entrada", data_actual_entrada );
//
//                int mes_seguinte_entrada = Integer.parseInt( UtensiliosParaDatas.devolveMesDaData(data_actual_entrada) );
//                session.setAttribute("mes_seguinte_entrada", mes_seguinte_entrada );
//
//                int ano_seguinte_entrada = Integer.parseInt( UtensiliosParaDatas.devolveAnoDaData(data_actual_entrada) );
//                session.setAttribute("ano_seguinte_entrada", ano_seguinte_entrada );
//
//                String dia_inicio = UtensiliosParaDatas.devolveDiaDaData( data_actual_entrada );
//                session.setAttribute("dia_inicio", dia_inicio);
//
//                String hora_entrada = (String) dados_internamento.get(2);
//                session.setAttribute("hora_entrada", hora_entrada);
//                session.setAttribute("hora_entrada_existente", hora_entrada);
//
//                String hora_saida = (String) dados_internamento.get(3);
//                session.setAttribute("hora_saida", hora_saida);
//                session.setAttribute("hora_saida_existente", hora_saida);
//
//                Date data_actual_saida = UtensiliosParaDatas.devolveDataEmDate( (String) dados_internamento.get(1) );
//                session.setAttribute("data_existente_saida", data_actual_saida);
//
//                String dia_fim = UtensiliosParaDatas.devolveDiaDaData( data_actual_saida );
//                session.setAttribute("dia_fim", dia_fim);
//
//                organizaLinksParaCalendario_saida(request, session);
//
//                session.setAttribute("data_actual_saida", data_actual_saida);
//
//                response.sendRedirect("/altera_internamento.jsp");
//            } else if (sub_accao != null && sub_accao.equals("segunda")) {
//
//                organizaLinksParaCalendario_saida(request, session);
//
//                response.sendRedirect("/altera_internamento.jsp");
//
//            } else if (sub_accao != null && sub_accao.equals("terceira")) {
//                if (dadosEstaoValidos(request, GestorDeServicos.ALTERAR_INTERNAMENTO)) {
//
//                    Date data_saida = (Date) session.getAttribute("data_actual_saida");
//
//                    //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
//                    int ano_escolhido = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_saida));
//                    int mes_escolhido = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_saida));
//                    int dia_escolhido = Integer.parseInt((String) session.getAttribute("dia_fim"));
//
//                    int hora_escolhida = Integer.parseInt((String) session.getAttribute("hora_saida"));
//
//System.out.println("����������� ano_saida = " + ano_escolhido + ", mes_saida = " + mes_escolhido + ", dia_saida = " + dia_escolhido + ", " + hora_escolhida + ". ���������������");
//
//                    Integer id_internamento = (Integer) session.getAttribute("id_internamento");
//
//                    Hashtable<String, Object> dados = new Hashtable<String, Object>();
//                    String data_saida_inserir = ("" + ano_escolhido + "-" + (mes_escolhido) + "-" + dia_escolhido + "");
//                    dados.put("var_data_saida", data_saida_inserir);
//                    dados.put("var_hora_saida", new Integer(hora_escolhida) );
//                    dados.put("var_id_internamento_cliente", id_internamento );
//
//                    Hospital.actualizaSaidaInternamento( dados );
//
//                    session.setAttribute("erros", null);
//
//                    Integer id_pessoa = (Integer) session.getAttribute("id_pessoa");
//                    session.setAttribute("msg_sucesso", "Internamento alterado com sucesso.");
//                    session.setAttribute("nome_pagina_link", "dos dados do cliente");
//                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
//                    response.sendRedirect("/mostra_sucesso.jsp");
//
//
//                } else {
//                    session.setAttribute("erros", devolveTabelaDeErrosAlterarInternamento(request));
//
//                    // Propaga dados, previamente inseridos, pela sessao
//                    //session.setAttribute("descricao", request.getParameter("descricao"));
//                    //session.setAttribute("observacao", request.getParameter("observacao"));
//
//                    //FAZER AQUI O SET DOS ATRIBUTES LIDOS DA P�GINA
//
//                    response.sendRedirect("/altera_internamento.jsp");
//                }
//            } else {
//                session.setAttribute("excepcao", "Url incorrecto.");
//                response.sendRedirect("/mostra_erro.jsp");
//            }
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    private void organizaLinksParaCalendario(HttpServletRequest request, HttpSession session) throws IOException {
        if (request.getParameter("data") == null) {
            GregorianCalendar calendar = new GregorianCalendar();
            session.setAttribute("mes_anterior", calendar.get(GregorianCalendar.MONTH));
            session.setAttribute("ano_anterior", calendar.get(GregorianCalendar.YEAR));

            calendar.add(GregorianCalendar.MONTH, 1);
            session.setAttribute("mes_seguinte", calendar.get(GregorianCalendar.MONTH));
            session.setAttribute("ano_seguinte", calendar.get(GregorianCalendar.YEAR));

            GregorianCalendar calendar_agora = new GregorianCalendar();
            Date data = UtensiliosParaDatas.devolveData(calendar_agora.get(GregorianCalendar.YEAR), calendar_agora.get(GregorianCalendar.MONTH),
                    calendar_agora.get(GregorianCalendar.DAY_OF_MONTH));
            session.setAttribute("data_actual", data);
        } else {
            String data = request.getParameter("data");
            int mes = Integer.parseInt(data.split("_")[0]);
            int ano = Integer.parseInt(data.split("_")[1]);

            GregorianCalendar calendar_a_comparar = new GregorianCalendar(ano, mes, 1);
            GregorianCalendar calendar_agora = new GregorianCalendar();
            if (calendar_a_comparar.before(calendar_agora)) {
                session.setAttribute("mes_anterior", calendar_agora.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_anterior", calendar_agora.get(GregorianCalendar.YEAR));
            } else {
                calendar_a_comparar.add(GregorianCalendar.MONTH, -1);
                session.setAttribute("mes_anterior", calendar_a_comparar.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_anterior", calendar_a_comparar.get(GregorianCalendar.YEAR));
            }

            GregorianCalendar calendar_maximo = new GregorianCalendar();
            calendar_maximo.add(GregorianCalendar.MONTH, 8);

            calendar_a_comparar = new GregorianCalendar(ano, mes, 1);
            if (calendar_a_comparar.after(calendar_maximo) || (calendar_a_comparar.get(GregorianCalendar.MONTH) == calendar_maximo.get(GregorianCalendar.MONTH) && calendar_a_comparar.get(GregorianCalendar.YEAR) == calendar_maximo.get(GregorianCalendar.YEAR))) {
                session.setAttribute("mes_seguinte", calendar_maximo.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_seguinte", calendar_maximo.get(GregorianCalendar.YEAR));
            } else {
                calendar_a_comparar.add(GregorianCalendar.MONTH, 1);
                session.setAttribute("mes_seguinte", calendar_a_comparar.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_seguinte", calendar_a_comparar.get(GregorianCalendar.YEAR));
            }

            session.setAttribute("data_actual", UtensiliosParaDatas.devolveData(ano, mes, 1));
        }


        GregorianCalendar calendar = new GregorianCalendar();
        session.setAttribute("primeiro_mes", calendar.get(GregorianCalendar.MONTH));
        session.setAttribute("primeiro_ano", calendar.get(GregorianCalendar.YEAR));

        GregorianCalendar calendar_maximo = new GregorianCalendar();
        calendar_maximo.add(GregorianCalendar.MONTH, 8);
        session.setAttribute("ultimo_mes", calendar_maximo.get(GregorianCalendar.MONTH));
        session.setAttribute("ultimo_ano", calendar_maximo.get(GregorianCalendar.YEAR));
    }
    //acrescentei

    private void organizaLinksParaCalendario_entrada(HttpServletRequest request, HttpSession session) throws IOException {

        //if (request.getParameter("data") == null) {//alterei
        if (request.getParameter("data_entrada") == null || request.getParameter("data_entrada").equals("")) {
            GregorianCalendar calendar = new GregorianCalendar();
            session.setAttribute("mes_anterior_entrada", calendar.get(GregorianCalendar.MONTH));
            session.setAttribute("ano_anterior_entrada", calendar.get(GregorianCalendar.YEAR));

            calendar.add(GregorianCalendar.MONTH, 1);
            session.setAttribute("mes_seguinte_entrada", calendar.get(GregorianCalendar.MONTH));
            session.setAttribute("ano_seguinte_entrada", calendar.get(GregorianCalendar.YEAR));

            GregorianCalendar calendar_agora = new GregorianCalendar();
            Date data = UtensiliosParaDatas.devolveData(calendar_agora.get(GregorianCalendar.YEAR), calendar_agora.get(GregorianCalendar.MONTH),
                    calendar_agora.get(GregorianCalendar.DAY_OF_MONTH));
            session.setAttribute("data_actual_entrada", data);
        } else {
            String data = request.getParameter("data_entrada");
            int mes = Integer.parseInt(data.split("_")[0]);
            int ano = Integer.parseInt(data.split("_")[1]);

            GregorianCalendar calendar_a_comparar = new GregorianCalendar(ano, mes, 1);
            GregorianCalendar calendar_agora = new GregorianCalendar();
            if (calendar_a_comparar.before(calendar_agora)) {
                session.setAttribute("mes_anterior_entrada", calendar_agora.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_anterior_entrada", calendar_agora.get(GregorianCalendar.YEAR));
            } else {
                calendar_a_comparar.add(GregorianCalendar.MONTH, -1);
                session.setAttribute("mes_anterior_entrada", calendar_a_comparar.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_anterior_entrada", calendar_a_comparar.get(GregorianCalendar.YEAR));
            }

            GregorianCalendar calendar_maximo = new GregorianCalendar();
            calendar_maximo.add(GregorianCalendar.MONTH, 8);

            calendar_a_comparar = new GregorianCalendar(ano, mes, 1);
            if (calendar_a_comparar.after(calendar_maximo) || (calendar_a_comparar.get(GregorianCalendar.MONTH) == calendar_maximo.get(GregorianCalendar.MONTH) && calendar_a_comparar.get(GregorianCalendar.YEAR) == calendar_maximo.get(GregorianCalendar.YEAR))) {
                session.setAttribute("mes_seguinte_entrada", calendar_maximo.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_seguinte_entrada", calendar_maximo.get(GregorianCalendar.YEAR));
            } else {
                calendar_a_comparar.add(GregorianCalendar.MONTH, 1);
                session.setAttribute("mes_seguinte_entrada", calendar_a_comparar.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_seguinte_entrada", calendar_a_comparar.get(GregorianCalendar.YEAR));
            }

            session.setAttribute("data_actual_entrada", UtensiliosParaDatas.devolveData(ano, mes, 1));
        }

        GregorianCalendar calendar = new GregorianCalendar();
        session.setAttribute("primeiro_mes_entrada", calendar.get(GregorianCalendar.MONTH));
        session.setAttribute("primeiro_ano_entrada", calendar.get(GregorianCalendar.YEAR));

        GregorianCalendar calendar_maximo = new GregorianCalendar();
        calendar_maximo.add(GregorianCalendar.MONTH, 8);
        session.setAttribute("ultimo_mes_entrada", calendar_maximo.get(GregorianCalendar.MONTH));
        session.setAttribute("ultimo_ano_entrada", calendar_maximo.get(GregorianCalendar.YEAR));
    }

    //acrescentei
    private void organizaLinksParaCalendario_saida(HttpServletRequest request, HttpSession session) throws IOException {

        if (request.getParameter("data_saida") == null || request.getParameter("data_saida").equals("")) {

            //dados para o calendario que vai aparecer
            int dia = Integer.parseInt((String) session.getAttribute("dia_inicio"));
            Date data_actual = (Date) session.getAttribute("data_actual_entrada");
            int mes = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual));
            int ano = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_actual));

            //links anterior
            int mes_anterior_entrada = mes;
            int ano_anterior_entrada = ano;
            GregorianCalendar calendar = new GregorianCalendar();
            session.setAttribute("mes_anterior_saida", mes_anterior_entrada);
            session.setAttribute("ano_anterior_saida", ano_anterior_entrada);

            //links seguinte
            calendar.add(GregorianCalendar.MONTH, 1);
            int mes_seguinte_entrada = (Integer) session.getAttribute("mes_seguinte_entrada");
            int ano_seguinte_entrada = (Integer) session.getAttribute("ano_seguinte_entrada");
            session.setAttribute("mes_seguinte_saida", mes_seguinte_entrada);
            session.setAttribute("ano_seguinte_saida", ano_seguinte_entrada);

            //constru��o da data final
            Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);
            session.setAttribute("data_actual_saida", data);

        } else {

            String data = request.getParameter("data_saida");
            int mes = Integer.parseInt(data.split("_")[0]);
            int ano = Integer.parseInt(data.split("_")[1]);

            GregorianCalendar calendar_a_comparar = new GregorianCalendar(ano, mes, 1);
            GregorianCalendar calendar_agora = new GregorianCalendar();
            if (calendar_a_comparar.before(calendar_agora)) {
                session.setAttribute("mes_anterior_saida", calendar_agora.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_anterior_saida", calendar_agora.get(GregorianCalendar.YEAR));
            } else {
                Date data_actual = (Date) session.getAttribute("data_actual_entrada");
                int mes_entrada = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual));
                if (mes != mes_entrada) {
                    calendar_a_comparar.add(GregorianCalendar.MONTH, -1);
                }
                session.setAttribute("mes_anterior_saida", calendar_a_comparar.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_anterior_saida", calendar_a_comparar.get(GregorianCalendar.YEAR));
            }

            GregorianCalendar calendar_maximo = new GregorianCalendar();
            calendar_maximo.add(GregorianCalendar.MONTH, 8);

            calendar_a_comparar = new GregorianCalendar(ano, mes, 1);
            if (calendar_a_comparar.after(calendar_maximo) || (calendar_a_comparar.get(GregorianCalendar.MONTH) == calendar_maximo.get(GregorianCalendar.MONTH) && calendar_a_comparar.get(GregorianCalendar.YEAR) == calendar_maximo.get(GregorianCalendar.YEAR))) {
                session.setAttribute("mes_seguinte_saida", calendar_maximo.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_seguinte_saida", calendar_maximo.get(GregorianCalendar.YEAR));
            } else {
                calendar_a_comparar.add(GregorianCalendar.MONTH, 1);
                session.setAttribute("mes_seguinte_saida", calendar_a_comparar.get(GregorianCalendar.MONTH));
                session.setAttribute("ano_seguinte_saida", calendar_a_comparar.get(GregorianCalendar.YEAR));
            }

            session.setAttribute("data_actual_saida", UtensiliosParaDatas.devolveData(ano, mes, 1));
        }


        Date data_actual = (Date) session.getAttribute("data_actual_entrada");
        int mes = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual));
        int ano = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_actual));
        session.setAttribute("primeiro_mes_saida", mes);
        session.setAttribute("primeiro_ano_saida", ano);

        GregorianCalendar calendar_maximo = new GregorianCalendar();
        calendar_maximo.add(GregorianCalendar.MONTH, 8);
        session.setAttribute("ultimo_mes_saida", calendar_maximo.get(GregorianCalendar.MONTH));
        session.setAttribute("ultimo_ano_saida", calendar_maximo.get(GregorianCalendar.YEAR));
    }

    public void marcarFaltaDeComparenciaDeConsulta(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//
//            int id_consulta = Integer.parseInt(request.getParameter("id"));
//            int id_colaborador = Integer.parseInt(request.getParameter("id_colaborador"));
//            Servico servico = Servico.devolve(id_consulta);
//            servico.concluiPorFalta();
//            servico.gravaParaBaseDeDados();
//
//            
//            //response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//            session.setAttribute("msg_sucesso", "Consulta dada como conclu�da, por falta de compar�ncia, com sucesso.");
//            session.setAttribute("nome_pagina_link", "das consultas");
//            session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//            response.sendRedirect("/mostra_sucesso.jsp");
//            
//
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }
//

    public void marcarComparenciaDeConsulta(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//
//            int id_consulta = Integer.parseInt(request.getParameter("id"));
//            int id_colaborador = Integer.parseInt(request.getParameter("id_colaborador"));
//            Servico servico = Servico.devolve(id_consulta);
//            servico.concluiPorComparencia();
//            servico.gravaParaBaseDeDados();
//
//   
//            //response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//            session.setAttribute("msg_sucesso", "Consulta dada como conclu�da, por compar�ncia com sucesso.");
//            session.setAttribute("nome_pagina_link", "das consultas");
//            session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//            response.sendRedirect("/mostra_sucesso.jsp");
//          
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }
//

    public void cancelarConsulta(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//
//            int id_consulta = Integer.parseInt((String) request.getParameter("id_consulta"));
//            int id_utente = Integer.parseInt((String) request.getParameter("id_utente"));
//
//            Servico servico = Servico.devolve(id_consulta);
//            servico.cancela();
//            servico.gravaParaBaseDeDados();
//
//       
//            //response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas&sub_accao=primeira&id=" + id_utente);
//            session.setAttribute("msg_sucesso", "Consulta cancelada com sucesso.");
//            session.setAttribute("nome_pagina_link", "das consultas");
//            session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas&sub_accao=primeira&id=" + id_utente);
//            response.sendRedirect("/mostra_sucesso.jsp");
//          
//
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    public void pagarServico(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            String sub_accao = (String) request.getParameter("sub_accao");
//
//            // Primeira accao
//            // Popula os dados do servico a pagar nos atributos da seccao
//            if (sub_accao != null && sub_accao.equals("primeira")) {
//
//                String[] id_servicos = request.getParameterValues("servicos");
//                int id_utente = Integer.parseInt(request.getParameter("id_utente"));
//
//                if (id_servicos != null) {
//                    LinkedList<Servico> servicos = new LinkedList<Servico>();
//                    for (String id_servico_string : id_servicos) {
//                        int id_servico = Integer.parseInt(id_servico_string);
//                        servicos.add(Servico.devolve(id_servico));
//                    }
//
//                    session.setAttribute("servicos", servicos);
//
//                    String perfil = ContaDeUtilizador.devolvePerfil(id_utente);
//                    Utente utente = null;
//                    if (perfil.equals("cliente_particular")) {
//                        utente = ClienteParticular.devolve(id_utente);
//                    } else if (perfil.equals("cliente_empresa")) {
//                        utente = ClienteEmpresa.devolve(id_utente);
//                    } else if (perfil.equals("membro_do_agregado")) {
//                        utente = MembroDoAgregado.devolve(id_utente);
//                    }
//                    session.setAttribute("utente", utente);
//
//                    response.sendRedirect("/paga_servico.jsp");
//                } else {
//                    response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas&id=" + id_utente);
//                }
//
//            } else if (sub_accao != null && sub_accao.equals("segunda")) {
//                if (dadosEstaoValidos(request, GestorDeServicos.PAGAR_SERVICO)) {
//
//                    Hashtable<String, Object> dados_do_pagamento = populaTabelaPagarServico(request);
//
//                    Pagamento.insere(dados_do_pagamento);
//                    int ultimo_id_de_pagamento = Pagamento.devolveUltimoIdentificadorDeInsercao();
//                    @SuppressWarnings("unchecked")
//                    LinkedList<Servico> servicos = (LinkedList<Servico>) session.getAttribute("servicos");
//                    for ( Servico servico : servicos) {
//                        servico.paga(ultimo_id_de_pagamento);
//                        servico.gravaParaBaseDeDados();
//                    }
//
//                    String emitir_factura = request.getParameter("emitir_factura");
//                    if (emitir_factura != null && emitir_factura.equals("emitir")) {
//                        Pagamento pagamento = Pagamento.devolve(ultimo_id_de_pagamento);
//                        Factura.insere(pagamento.getData(), pagamento.getIdPagamento());
//                    }
//
//                    session.setAttribute("erros", null);
//
//                    int id_utente = Integer.parseInt(request.getParameter("id_utente"));
//                    response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas&id=" + id_utente);
//
//                } else {
//                    session.setAttribute("erros", devolveTabelaDeErros(request, GestorDeServicos.PAGAR_SERVICO));
//
//                    // Propaga dados, previamente inseridos, pela sessao
//                    session.setAttribute("emitir_factura", request.getParameter("emitir_factura"));
//                    session.setAttribute("tipo_pagamento", request.getParameter("tipo_pagamento"));
//                    session.setAttribute("numero_de_cheque", request.getParameter("numero_de_cheque"));
//                    session.setAttribute("tipo_de_cartao", request.getParameter("tipo_de_cartao"));
//                    session.setAttribute("numero_de_cartao", request.getParameter("numero_de_cartao"));
//                    session.setAttribute("data_de_validade_do_cartao_ano", request.getParameter("data_de_validade_do_cartao_ano"));
//                    session.setAttribute("data_de_validade_do_cartao_mes", request.getParameter("data_de_validade_do_cartao_mes"));
//                    session.setAttribute("data_de_validade_do_cartao_dia", request.getParameter("data_de_validade_do_cartao_dia"));
//
//                    response.sendRedirect("/paga_servico.jsp");
//                }
//            } else {
//                session.setAttribute("excepcao", "Url incorrecto.");
//                response.sendRedirect("/mostra_erro.jsp");
//            }
//
//        } catch ( SQLException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//            System.out.println("Ocorreu um erro no..." + GestorDeServicos.PAGAR_SERVICO);
//        } catch ( ClassNotFoundException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//            System.out.println("Ocorreu um erro no..." + GestorDeServicos.PAGAR_SERVICO);
//        } catch ( InstantiationException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//            System.out.println("Ocorreu um erro no..." + GestorDeServicos.PAGAR_SERVICO);
//        } catch ( IllegalAccessException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//            System.out.println("Ocorreu um erro no..." + GestorDeServicos.PAGAR_SERVICO);
//        } catch ( IOException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//            System.out.println("Ocorreu um erro no..." + GestorDeServicos.PAGAR_SERVICO);
//        }
    }

    public void emitirFactura(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            Servico consulta = (Servico) session.getAttribute("consulta");
//            Pagamento pagamento = Pagamento.devolve(consulta.getIdPagamento());
//            pagamento.emiteFactura();
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    public void visualizarFichaMedica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            int id_servico_prestado = Integer.parseInt(request.getParameter("id"));
//            LinkedList<String> lista = Servico.devolveTodosOsDadosDaFichaMedica(id_servico_prestado);
//
//            session.setAttribute("lista_ficha_medica", lista);
//            response.sendRedirect("/consultar_ficha_medica.jsp");
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    public void visualizarExames(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            session.setAttribute("id_hospital", request.getParameter("id_hospital"));
            session.setAttribute("especialidade", request.getParameter("especialidade"));
            session.setAttribute("id_medico", request.getParameter("id_colaborador"));
            session.setAttribute("id_utente", request.getParameter("id_utente"));
            session.setAttribute("dia", request.getParameter("dia"));
            session.setAttribute("hora", request.getParameter("hora"));
            session.setAttribute("id_servico_prestado", request.getParameter("id_servico_prestado"));

            String sub_accao = (String) request.getParameter("sub_accao");

            if (sub_accao != null && sub_accao.equals("primeira")) {
                session.setAttribute("sub_accao", "primeira");

                Long id_consulta = Long.parseLong(request.getParameter("id"));
                session.setAttribute("id_servico_prestado", request.getParameter("id"));

                LinkedList<Servico> exames_marcados = Servico.devolveTodosOsExames(id_consulta);

                session.setAttribute("exames_marcados", exames_marcados);
                response.sendRedirect("/lista_exames.jsp");
            }

        } catch (Exception e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void visualizarConsultas(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            session.setAttribute("id_hospital", request.getParameter("id_hospital"));
            session.setAttribute("especialidade", request.getParameter("especialidade"));
            session.setAttribute("id_medico", request.getParameter("id_medico"));
            session.setAttribute("dia", request.getParameter("dia"));
            session.setAttribute("hora", request.getParameter("hora"));

            String sub_accao = (String) request.getParameter("sub_accao");

            if (sub_accao != null && sub_accao.equals("primeira")) {
                session.setAttribute("sub_accao", "primeira");
                Long id_utente = Long.parseLong(request.getParameter("id"));
                session.setAttribute("id_utente", request.getParameter("id"));
                session.setAttribute("lista_membros", MembroDoAgregado.devolveTodosDoCliente(id_utente));
                response.sendRedirect("/mostra_consultas.jsp");

            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                session.setAttribute("sub_accao", "segunda");
                Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));

                session.setAttribute("id_utente", id_pessoa.toString());
                session.setAttribute("id_pessoa_selecionada", id_pessoa.toString());

                System.out.println("ID_PESSOA = " + id_pessoa);

                LinkedList<Servico> consultas_canceladas = Servico.devolveTodosOsCanceladosDoUtente(id_pessoa);
                LinkedList<Servico> consultas_concluidas = Servico.devolveTodosOsConcluidosDoUtente(id_pessoa);
                LinkedList<Servico> consultas_activas = Servico.devolveTodosOsActivosDoUtente(id_pessoa);
                LinkedList<Servico> exames_marcados = Servico.devolveExamesUtente(id_pessoa);

                session.setAttribute("consultas_canceladas", consultas_canceladas);
                session.setAttribute("consultas_concluidas", consultas_concluidas);
                session.setAttribute("consultas_activas", consultas_activas);
                session.setAttribute("exames_marcados", exames_marcados);

                String perfil = ContaDeUtilizador.devolvePerfil(id_pessoa);

                System.out.println("YEAAAH -> " + perfil);

                Pessoa utente = null;
                if (perfil.equals("particular")) {
                    utente = ClienteParticular.devolve(id_pessoa);
                } else if (perfil.equals("cliente_empresa")) {
                    // utente = ClienteEmpresa.devolve(new Integer(id_pessoa));
                } else if (perfil.equals("membro")) {
                    utente = MembroDoAgregado.devolve(id_pessoa);
                }

                session.setAttribute("utente", utente);
                response.sendRedirect("/mostra_consultas.jsp");
            }

        } catch (Exception e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void visualizarHistorialMedico(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            int id_utente = ((Pessoa) session.getAttribute("utilizador")).getIdPessoa();
//            LinkedList<Servico> consultas_concluidas = Servico.devolveTodosOsConcluidosDoUtente(id_utente);
//            session.setAttribute("consultas_concluidas", consultas_concluidas);
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    public void visualizarConsultasDoColaborador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            int id_colaborador = Integer.parseInt(request.getParameter("id"));
//            LinkedList<Servico> consultas_canceladas = Servico.devolveTodosOsCanceladosDoColaborador(id_colaborador);
//            LinkedList<Servico> consultas_concluidas = Servico.devolveTodosOsConcluidosDoColaborador(id_colaborador);
//            LinkedList<Servico> consultas_activas = Servico.devolveTodosOsActivosDoColaborador(id_colaborador);
//            LinkedList<Servico> consultas_do_dia = Servico.devolveTodosDoDiaDoColaborador(id_colaborador);
//
//            session.setAttribute("consultas_canceladas", consultas_canceladas);
//            session.setAttribute("consultas_concluidas", consultas_concluidas);
//            session.setAttribute("consultas_activas", consultas_activas);
//            session.setAttribute("consultas_do_dia", consultas_do_dia);
//
//            Colaborador colaborador = Medico.devolve(id_colaborador);
//            session.setAttribute("colaborador", colaborador);
//
//            response.sendRedirect("/mostra_consultas_colaborador.jsp");
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    public void inserirFichaMedica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//            String sub_accao = (String) request.getParameter("sub_accao");
//            if (sub_accao != null && sub_accao.equals("primeira")) {
//                int id_servico = Integer.parseInt(request.getParameter("id"));
//                int id_colaborador = Integer.parseInt(request.getParameter("id_colaborador"));
//                System.out.println("helllo...." + id_colaborador);
//                Servico servico = Servico.devolve(id_servico);
//                session.setAttribute("servico", servico);
//                session.setAttribute("id_colaborador", id_colaborador);
//
//                response.sendRedirect("/inserir_ficha_medica.jsp");
//            } else if (sub_accao != null && sub_accao.equals("segunda")) {
//                if (dadosEstaoValidos(request, GestorDeServicos.INSERIR_FICHA_MEDICA)) {
//
//                    Servico servico = (Servico) session.getAttribute("servico");
//
//                    servico.setSintoma(request.getParameter("sintomas"));
//                    servico.setDiagnostico(request.getParameter("diagnostico"));
//                    servico.setObservacaoPublica(request.getParameter("observacoes_publicas"));
//                    servico.setObservacaoPrivada(request.getParameter("observacoes_privadas"));
//
//                    servico.gravaParaBaseDeDados();
//
//                    session.removeAttribute("erros");
//
//                    int id_colaborador = (Integer) session.getAttribute("id_colaborador");
//
//                    session.setAttribute("erros", null);
//
//                  
//                    //response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//                    session.setAttribute("msg_sucesso", "Ficha m�dica inserida com sucesso.");
//                    session.setAttribute("nome_pagina_link", "das consultas");
//                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//                    response.sendRedirect("/mostra_sucesso.jsp");
//              
//
//                } else {
//                    Hashtable<String, String> erros = devolveTabelaDeErrosInserirFichaMedica(request);
//
//                    session.setAttribute("sintomas", request.getParameter("sintomas"));
//                    session.setAttribute("diagnostico", request.getParameter("diagnostico"));
//                    session.setAttribute("observacoes_publicas", request.getParameter("observacoes_publicas"));
//                    session.setAttribute("observacoes_privadas", request.getParameter("observacoes_privadas"));
//                    session.setAttribute("erros", erros);
//
//                    response.sendRedirect("/inserir_ficha_medica.jsp");
//                }
//            } else {
//                session.setAttribute("excepcao", "Url incorrecto.");
//                response.sendRedirect("/mostra_erro.jsp");
//            }
//
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    public void alterarFichaMedica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
//        try {
//
//            String sub_accao = (String) request.getParameter("sub_accao");
//
//            if (sub_accao != null && sub_accao.equals("primeira")) {
//                int id_servico = Integer.parseInt(request.getParameter("id"));
//                int id_colaborador = Integer.parseInt(request.getParameter("id_colaborador"));
//                Servico servico = Servico.devolve(id_servico);
//                session.setAttribute("servico", servico);
//
//                session.setAttribute("sintomas", servico.getSintoma());
//                session.setAttribute("diagnostico", servico.getDiagnostico());
//                session.setAttribute("observacoes_publicas", servico.getObservacaoPublica());
//                session.setAttribute("observacoes_privadas", servico.getObservacaoPrivada());
//
//                session.setAttribute("id_colaborador", id_colaborador);
//
//                response.sendRedirect("/altera_ficha_medica.jsp");
//            } else if (sub_accao != null && sub_accao.equals("segunda")) {
//                if (dadosEstaoValidos(request, GestorDeServicos.INSERIR_FICHA_MEDICA)) {
//
//                    Servico servico = (Servico) session.getAttribute("servico");
//
//                    servico.setSintoma(request.getParameter("sintomas"));
//                    servico.setDiagnostico(request.getParameter("diagnostico"));
//                    servico.setObservacaoPublica(request.getParameter("observacoes_publicas"));
//                    servico.setObservacaoPrivada(request.getParameter("observacoes_privadas"));
//
//                    servico.gravaParaBaseDeDados();
//
//                    session.removeAttribute("erros");
//
//                    int id_colaborador = (Integer) session.getAttribute("id_colaborador");
//
//                    //Helio6{
//                    //response.sendRedirect("Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//                    session.setAttribute("msg_sucesso", "Ficha m�dica alterada com sucesso.");
//                    session.setAttribute("nome_pagina_link", "das consultas");
//                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_servicos&accao=visualizar_consultas_do_colaborador&id=" + id_colaborador);
//                    response.sendRedirect("/mostra_sucesso.jsp");
//                    //}Helio6
//
//                } else {
//                    Hashtable<String, String> erros = devolveTabelaDeErrosInserirFichaMedica(request);
//
//                    session.setAttribute("sintomas", request.getParameter("sintomas"));
//                    session.setAttribute("diagnostico", request.getParameter("diagnostico"));
//                    session.setAttribute("observacoes_publicas", request.getParameter("observacoes_publicas"));
//                    session.setAttribute("observacoes_privadas", request.getParameter("observacoes_privadas"));
//                    session.setAttribute("erros", erros);
//
//                    response.sendRedirect("/altera_ficha_medica.jsp");
//                }
//            } else {
//                session.setAttribute("excepcao", "Url incorrecto.");
//                response.sendRedirect("/mostra_erro.jsp");
//            }
//
//        } catch (SQLException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IOException e) {
//
//            e.printStackTrace();
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        }
    }

    private boolean dadosEstaoValidos(final HttpServletRequest request, final String action) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        return devolveTabelaDeErros(request, action).isEmpty();
    }

    private Hashtable<String, String> devolveTabelaDeErros(final HttpServletRequest request, final String action) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {
        if (action.equals(GestorDeServicos.MARCAR_CONSULTA)) {
            return devolveTabelaDeErrosParaMarcarConsulta(request);
        } else if (action.equals(GestorDeServicos.PAGAR_SERVICO)) {
            return devolveTabelaDeErrosParaPagarServico(request);
        } else if (action.equals(GestorDeServicos.SOLICITAR_INTERNAMENTO)) {
            return devolveTabelaDeErrosSolicitarInternamento(request);
        } else if (action.equals(GestorDeServicos.INSERIR_FICHA_MEDICA)) {
            return devolveTabelaDeErrosInserirFichaMedica(request);
        } else if (action.equals(GestorDeServicos.ALTERAR_INTERNAMENTO)) {
            return devolveTabelaDeErrosAlterarInternamento(request);
        } else {
            return new Hashtable<String, String>();
        }
    }


    private Hashtable<String, String> devolveTabelaDeErrosAlterarInternamento(final HttpServletRequest request) {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

        String sub_accao = (String) request.getParameter("sub_accao");
        HttpSession session = request.getSession();

        if (sub_accao != null && sub_accao.equals("terceira")) {

            Date data_entrada_existente = (Date) session.getAttribute("data_existente_entrada");
            //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
            int ano_entrada_existente = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_entrada_existente));
            int mes_entrada_existente = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_entrada_existente));
            int dia_entrada_existente = Integer.parseInt(UtensiliosParaDatas.devolveDiaDaData(data_entrada_existente));

            Date data_saida_existente = (Date) session.getAttribute("data_existente_saida");
            //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
            int ano_saida_existente = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_saida_existente));
            int mes_saida_existente = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_saida_existente));
            int dia_saida_existente = Integer.parseInt(UtensiliosParaDatas.devolveDiaDaData(data_saida_existente));

            int hora_entrada_existente = Integer.parseInt((String) session.getAttribute("hora_entrada_existente"));
            int hora_saida_existente = Integer.parseInt((String) session.getAttribute("hora_saida_existente"));


            System.out.println("����������� ano_entrada_existente = " + ano_entrada_existente + ", mes_entrada_existente = " + mes_entrada_existente + ", dia_entrada_existente = " + dia_entrada_existente + ", hora_entrada_existente = " + hora_entrada_existente + ". ���������������");

            System.out.println("����������� ano_saida_existente = " + ano_saida_existente + ", mes_saida_existente = " + mes_saida_existente + ", dia_saida_existente = " + dia_saida_existente + ", hora_saida_existente = " + hora_saida_existente + ". ���������������");


            Date data_escolhida = (Date) session.getAttribute("data_actual_saida");
            //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
            int ano_escolhido = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_escolhida));
            int mes_escolhido = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_escolhida));

            String dia_escolhido_string = (String) request.getParameter("dia_fim");
            session.setAttribute("dia_fim", dia_escolhido_string);

            int dia_escolhido = 0;

            if (dia_escolhido_string == null || dia_escolhido_string.equals("")) {
                tabela_de_erros.put("dia_saida", "Tem de escolher um dia de saida.");
            } else {
                dia_escolhido = Integer.parseInt(dia_escolhido_string);
            }

            String hora_escolhida_string = (String) request.getParameter("hora_saida");
            session.setAttribute("hora_saida", hora_escolhida_string);
            int hora_escolhida = Integer.parseInt(hora_escolhida_string);

            //se o dia de saida for igual � data de entrada existente,
            // ent�o a hora apenas pode ser superior � anterior
            boolean dia_escolhido_igual_a_dia_entrada = (dia_escolhido == dia_entrada_existente && mes_escolhido == mes_entrada_existente && ano_escolhido == ano_entrada_existente);
            if (dia_escolhido_igual_a_dia_entrada && (hora_escolhida <= hora_entrada_existente)) {
                tabela_de_erros.put("dia_saida", "Dado que o dia escolhido igual ao dia de entrada j� existente, n�o � poss�vel escolher uma hora de entrada inferior � existente (" + hora_entrada_existente + ":00).");
            }

            //se o dia de saida for igual � data de saida existente,
            // ent�o a hora apenas pode ser inferior ou igual � anterior
            boolean dia_escolhido_igual_a_dia_saida = (dia_escolhido == dia_saida_existente && mes_escolhido == mes_saida_existente && ano_escolhido == ano_saida_existente);
            if (dia_escolhido_igual_a_dia_saida && (hora_escolhida > hora_saida_existente)) {
                tabela_de_erros.put("dia_saida", "Dado que o dia escolhido � igual ao dia de sa�da j� existente, n�o � poss�vel escolher uma hora de sa�da superior � existente (" + hora_saida_existente + ":00).");
            }

        }

        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaMarcarConsulta(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

//        String sub_accao = (String) request.getParameter("sub_accao");
//        HttpSession session = request.getSession();
//
//        if (sub_accao != null && (sub_accao.equals("primeira") || sub_accao.equals("segunda") || sub_accao.equals("terceira") || sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta"))) {
//            if (sub_accao.equals("primeira")) {
//                String id_utente = request.getParameter("id_utente");
//                if (id_utente == null || id_utente.trim().equals("")) {
//                    tabela_de_erros.put("id_utente", "Campo Obrigatório. Não pode estar vazio.");
//                } else if (!UtensiliosParaStrings.eUmNumero(id_utente)) {
//                    tabela_de_erros.put("id_utente", "O identificador do utente deverá ser numérico.");
//                }
//            }
//
//            if (sub_accao != null && (sub_accao.equals("segunda") || sub_accao.equals("terceira") || sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta"))) {
//
//                String id_hospital = request.getParameter("id_hospital");
//                if (id_hospital == null) {
//                    tabela_de_erros.put("id_hospital", "Campo Obrigat�rio. N�o pode estar vazio.");
//                } else if (id_hospital.trim().equals("")) {
//                    tabela_de_erros.put("id_hospital", "Campo Obrigat�rio. Escolha um Hospital.");
//                }
//
//                session.setAttribute("id_hospital", request.getParameter("id_hospital"));
//
//                if (sub_accao != null && (sub_accao.equals("terceira") || sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta"))) {
//                    String especialidade = (String) request.getParameter("especialidade");
//                    if (especialidade == null) {
//                        tabela_de_erros.put("especialidade", "Campo Obrigatório. Não pode estar vazio.");
//                    } else if (especialidade.trim().equals("")) {
//                        tabela_de_erros.put("especialidade", "Campo Obrigatório. Escolha uma especialidade.");
//                    }
//
//                    session.setAttribute("especialidade", request.getParameter("especialidade"));
//
//                    if (sub_accao != null && (sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta"))) {
//                        String id_medico = (String) request.getParameter("id_medico");
//                        if (id_medico == null) {
//                            tabela_de_erros.put("id_medico", "Campo Obrigatório. Não pode estar vazio.");
//                        } else if (id_medico.trim().equals("")) {
//                            tabela_de_erros.put("id_medico", "Campo Obrigatório. Escolha um médico.");
//                        }
//
//                        session.setAttribute("id_medico", request.getParameter("id_medico"));
//
//                        if (sub_accao != null && (sub_accao.equals("quinta") || sub_accao.equals("sexta"))) {
//                            String dia = (String) request.getParameter("dia");
//                            if (dia == null) {
//                                tabela_de_erros.put("dia", "Campo Obrigatório. Não pode estar vazio.");
//                            } else if (dia.trim().equals("")) {
//                                tabela_de_erros.put("dia", "Campo Obrigatório. Escolha um dia.");
//                            }
//
//                            session.setAttribute("dia", request.getParameter("dia"));
//
//                            if (sub_accao != null && sub_accao.equals("sexta")) {
//                                String hora = (String) request.getParameter("hora");
//                                if (hora == null) {
//                                    tabela_de_erros.put("hora", "Campo Obrigatório. Não pode estar vazio.");
//                                } else if (hora.trim().equals("")) {
//                                    tabela_de_erros.put("hora", "Campo Obrigatório. Escolha uma hora.");
//                                }else{
//                                    Date data_actual = (Date)session.getAttribute("data_actual");
//                                    System.out.println("o kek isto tem: " + data_actual);
//
//                                    String id_u = (session.getAttribute("id_utente")).toString();
//                                    int id_utente = Integer.parseInt(id_u);
//
////
//
//                                    String dia_aux = (session.getAttribute("dia")).toString();
//                                    int dia_e = Integer.parseInt(dia_aux);
//                                    System.out.println("Utente: " + id_utente);
//
//
//                                    int hora_e = Integer.parseInt(hora);
//                                    String mes_escolhido = session.getAttribute("mes").toString();
//                                    int mes_e = Integer.parseInt(mes_escolhido);
//                                    String ano_escolhido = session.getAttribute("ano").toString();
//                                    int ano_e = Integer.parseInt(ano_escolhido);
//
//                                    Date data_consulta = new Date(ano_e, mes_e, dia_e, hora_e, 0, 0);
//                                    boolean tem = ServicoGenerico.temConsultaParaHora(id_utente, data_consulta);
//                                    System.out.println("Consultas: " + tem);
//                                    if(!ServicoGenerico.temConsultaParaHora(id_utente, data_consulta) ){
//                                        tabela_de_erros.put("hora", "J� tem consulta marcada para essa hora");
//                                }
//
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        }
//     

        return tabela_de_erros;

    }

    private Hashtable<String, String> devolveTabelaDeErrosSolicitarInternamento(final HttpServletRequest request) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

//        String sub_accao = (String) request.getParameter("sub_accao");
//        HttpSession session = request.getSession();
//
//        if (sub_accao != null && (sub_accao.equals("primeira") || sub_accao.equals("segunda") || sub_accao.equals("terceira") || sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta") || sub_accao.equals("setima"))) {
//            if (sub_accao.equals("primeira")) {
//
//            }
//
//            if (sub_accao != null && (sub_accao.equals("segunda") || sub_accao.equals("terceira") || sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta") || sub_accao.equals("setima"))) {
//
//                String id_hospital = request.getParameter("id_hospital");
//                if (id_hospital.equals("")) {
//                    tabela_de_erros.put("id_hospital", "Tem de escolher um hospital.");
//                }
//
//                if (sub_accao != null && (sub_accao.equals("terceira") || sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta") || sub_accao.equals("setima"))) {
//                    String tipo_de_internamento = (String) request.getParameter("tipo_de_internamento");
//                    if (tipo_de_internamento.equals("")) {
//                        tabela_de_erros.put("tipo_de_internamento", "Tem de escolher um tipo de internamento.");
//                    }
//
//                    if (sub_accao != null && (sub_accao.equals("quarta") || sub_accao.equals("quinta") || sub_accao.equals("sexta") || sub_accao.equals("setima"))) {
//                        String dia_inicio = (String) request.getParameter("dia_inicio");
//System.out.println("Dia inicio: " + dia_inicio);
//                        if (dia_inicio == null || dia_inicio.equals("")) {
//                            tabela_de_erros.put("dia_inicio", "Tem de escolher um dia de entrada.");
//                        }
//
//                      
//                        LinkedList dias_indisp = (LinkedList) session.getAttribute("lista_dias_indisponiveis");
//                        Date mes_e_ano_entrada = (Date) session.getAttribute("data_actual_entrada");
//                        String mes_ano_string_entrada = UtensiliosParaDatas.converteParaStringComMesSeguinte(mes_e_ano_entrada);
//                        if (dia_inicio.length() == 1)
//                            dia_inicio = "0" + dia_inicio;
//                        String data_inicio = (mes_ano_string_entrada.substring(0,8)).concat(dia_inicio);
//
//                        String hora_entrada_string = (String) request.getParameter("hora_entrada");
//                        int hora_entrada = Integer.parseInt( hora_entrada_string );
////System.out.print("&&&&&&&&&&&&&& Hora de entrada: " +  hora_entrada_string);
//
//                        Calendar ca = Calendar.getInstance();
//                        int hora_actual = ca.get(Calendar.HOUR_OF_DAY);
//                        Date data_actual_date = UtensiliosParaDatas.agora();
//                        String data_actual = UtensiliosParaDatas.converteParaString(data_actual_date);
//
//                        if ( data_inicio.equals(data_actual) && hora_entrada < hora_actual ) {
//                            tabela_de_erros.put("dia_inicio", "N�o � possivel marcar um internamento para hoje, em que a hora pretendida � inferior � hora actual.");
//                        } else {
//                            if( dias_indisp.contains(data_inicio) ) {
//                                int id_utente = Integer.parseInt((String) session.getAttribute("id_utente_hahaha"));
//                                int id_data_contida = dias_indisp.indexOf(data_inicio);
//                                String data_contida = (String) dias_indisp.get(id_data_contida);
//                                int hora_saida_existente = Hospital.devolveHoraSaidaParaData(id_utente, data_contida);
//                                int hora_entrada_existente = Hospital.devolveHoraEntradaParaData(id_utente, data_contida);
//
//    //System.out.print("@@@@@@@@@@@@ Hora saida existente: " +  hora_saida_existente);
//    //System.out.print("@@@@@@@@@@@@ Hora entrada existente: " +  hora_entrada_existente);
//
//                                if ( hora_saida_existente == -1 && hora_entrada_existente == -1) { //quando der -1 em ambas as datas de entrada e sa�da � porque o dia vai estar todo lotado pois nao � de saida nem de entrada
//                                    tabela_de_erros.put("dia_inicio", "N�o � possivel marcar um internamento para " + data_inicio + ", pois j� existe outro internamento marcado para o mesmo dia (em qualquer hora).");
//                                }
//
//                                if ( hora_saida_existente != -1 && hora_entrada_existente == -1) { //quando der diferente de -1 apenas na hora de sa�da � porque corresponde (apenas) a uma data de saida
//                                    if ( hora_saida_existente > hora_entrada ) {
//                                        tabela_de_erros.put("dia_inicio", "N�o � possivel marcar um internamento para " + data_inicio + ", pois j� existe outro internamento marcado para o mesmo dia, cuja hora de sa�da � �s " + hora_saida_existente + ":00.");
//                                    }
//                                }
//
//                                if ( hora_saida_existente == -1 && hora_entrada_existente != -1) { //quando der diferente de -1 apenas na hora de entrada � porque corresponde (apenas) a uma data de entrada
//                                    if ( hora_entrada_existente < hora_entrada ) {
//                                        tabela_de_erros.put("dia_inicio", "N�o � possivel marcar um internamento para " + data_inicio + ", pois j� existe outro internamento marcado para o mesmo dia, cuja hora de entrada � �s " + hora_entrada_existente + ":00.");
//                                    }
//                                }
//
//                               if ( hora_saida_existente != -1 && hora_entrada_existente != -1) { //quando der diferente de -1 em ambas as datas de entrada e sa�da � porque corresponde (simultaneamente) a uma data de entrada e de saida
//                                    if ( hora_entrada_existente <= hora_entrada && hora_saida_existente > hora_entrada ) {
//                                        tabela_de_erros.put("dia_inicio", "N�o � possivel marcar um internamento para " + data_inicio + ", pois j� existe outro internamento marcado durante este mesmo dia, entre as " + hora_entrada_existente + ":00 e as " + hora_saida_existente + ":00.");
//                                    }
//                                }
//                            }
//                        }
//                       
//
//                        if (sub_accao != null && (sub_accao.equals("quinta") || sub_accao.equals("sexta") || sub_accao.equals("setima"))) {
//                            String dia_saida = (String) request.getParameter("dia_fim");
//                            if (dia_saida == null || dia_saida.equals("")) {
//                                tabela_de_erros.put("dia_saida", "Tem de escolher um dia de saida.");
//                            }
//
//                        
//                            Date mes_e_ano_saida = (Date) session.getAttribute("data_actual_saida");
//                            String mes_ano_string_saida = UtensiliosParaDatas.converteParaStringComMesSeguinte(mes_e_ano_saida);
//                            if (dia_saida.length() == 1)
//                                dia_saida = "0" + dia_saida;
//                            String data_saida = (mes_ano_string_saida.substring(0,8)).concat(dia_saida);
//
//                        
//                            String hora_saida_string = (String) request.getParameter("hora_saida");
//                            int hora_saida = Integer.parseInt( hora_saida_string );
////System.out.print("&&&&&&&&&&&&&& Hora de saida: " +  hora_saida_string);
//
//                            String data_a_verificar = "";
//
//                            /**
//                            //CORRIGIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
//                            if(data_saida.equals(data_inicio))
//                                data_a_verificar = "" + data_inicio;
//                            else
//                                data_a_verificar = UtensiliosParaDatas.diaSeguinte(data_inicio);
//                            **/
//                            data_a_verificar = "" + data_inicio;
//
//                         
//                            int dias_indisponiveis = 0;
//                            boolean nao_acabou = true;
//                            String lista_dias_colididos = "";
//                            String mensagem_relacionada_com_hora_saida = "";
//
//                            if( data_saida.equals(data_inicio) && (hora_entrada > hora_saida) ) {
//                                tabela_de_erros.put("dia_saida", "N�o � possivel marcar um internamento de um s� dia, em que a data de entrada � superior � hora de sa�da.");
//                            } else if( data_saida.equals(data_inicio) && (hora_entrada == hora_saida) ) {
//                                tabela_de_erros.put("dia_saida", "N�o � possivel marcar um internamento de um s� dia, em que a data de entrada � igual � hora de sa�da.");
//                            } else {
//                                while( nao_acabou ) {
//                                    if(data_a_verificar.equals(data_saida)) {
//                                        nao_acabou = false;
//
//                                 
//                                        if( dias_indisp.contains(data_a_verificar) ) {
//                                            int id_utente = Integer.parseInt((String) session.getAttribute("id_utente_hahaha"));
//                                            int id_data_contida = dias_indisp.indexOf(data_saida);
//                                            String data_contida = (String) dias_indisp.get(id_data_contida);
//    //System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%\ndata_contida: " + data_contida);
//                                            int hora_saida_existente = Hospital.devolveHoraSaidaParaData(id_utente, data_contida);
//                                            int hora_entrada_existente = Hospital.devolveHoraEntradaParaData(id_utente, data_contida);
//
//    //System.out.println("hora_saida_existente: " + hora_saida_existente + "\nhora_entrada_existente: " + hora_entrada_existente + "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
//
//                                            if ( hora_saida_existente == -1 && hora_entrada_existente == -1) { //quando der -1 em ambas as datas de entrada e sa�da � porque o dia vai estar todo lotado pois nao � de saida nem de entrada
//                                                if( dias_indisp.contains(data_a_verificar) ) {
//                                                    if(dias_indisponiveis == 0)
//                                                        lista_dias_colididos = "" + data_a_verificar;
//                                                    else
//                                                        lista_dias_colididos = lista_dias_colididos + ", " + data_a_verificar;
//                                                    ++dias_indisponiveis;
//                                                }
//                                            }
//
//                                            if ( hora_saida_existente != -1 && hora_entrada_existente == -1) { //quando der diferente de -1 apenas na hora de sa�da � porque corresponde (apenas) a uma data de saida
//                                                if ( hora_entrada < hora_saida_existente ) {
//                                                    mensagem_relacionada_com_hora_saida = " Para a data de sa�da, em " + data_saida + ", j� existe um j� existe outro internamento marcado para o mesmo dia que acaba �s " + hora_saida_existente + ":00.";
//                                                    ++dias_indisponiveis;
//                                                }
//                                            }
//
//                                            if ( hora_saida_existente == -1 && hora_entrada_existente != -1) { //quando der diferente de -1 apenas na hora de entrada � porque corresponde (apenas) a uma data de entrada
//                                                if ( hora_entrada_existente < hora_saida ) {
//                                                    mensagem_relacionada_com_hora_saida = " Para a data de sa�da, em " + data_saida + ", j� existe um j� existe outro internamento marcado para o mesmo dia que come�a �s " + hora_entrada_existente + ":00.";
//                                                    ++dias_indisponiveis;
//                                                }
//                                            }
//
//                                           if ( hora_saida_existente != -1 && hora_entrada_existente != -1) { //quando der diferente de -1 em ambas as datas de entrada e sa�da � porque corresponde (simultaneamente) a uma data de entrada e de saida
//                                                if ( !( (hora_saida <= hora_entrada_existente) || (hora_entrada >= hora_saida_existente) ) ) {
//                                                    mensagem_relacionada_com_hora_saida = " Para a data de sa�da, em " + data_saida + ", j� existe um outro internamento marcado para o mesmo dia entre as " + hora_entrada_existente + ":00 e as " + hora_saida_existente + ":00.";
//                                                    ++dias_indisponiveis;
//                                                }
//                                            }
//                                        }
//
//                                     } else {
//                                        if( dias_indisp.contains(data_a_verificar) && (!data_a_verificar.equals(data_inicio)) ) {
//                                            if(dias_indisponiveis == 0)
//                                                lista_dias_colididos = "" + data_a_verificar;
//                                            else
//                                                lista_dias_colididos = lista_dias_colididos + ", " + data_a_verificar;
//                                            ++dias_indisponiveis;
//                                        }
//
//                                        data_a_verificar = UtensiliosParaDatas.diaSeguinte(data_a_verificar);
//                                    }
//                                } //fim do while...
//
//                                if(dias_indisponiveis != 0) { //--> se existir dias indisponiveis --> indicar quais sao
//                                    if (dias_indisponiveis == 1) {
//                                        if ( lista_dias_colididos.equals("") )
//                                            tabela_de_erros.put("dia_saida", mensagem_relacionada_com_hora_saida);
//                                        else
//                                            tabela_de_erros.put("dia_saida", "N�o � possivel marcar um internamento para " + lista_dias_colididos + ", pois j� existe outro internamento marcado para o mesmo dia." + mensagem_relacionada_com_hora_saida);
//                                    } else {
//                                        tabela_de_erros.put("dia_saida", "N�o � possivel marcar um internamento para os seguintes dias: " + lista_dias_colididos + ", pois j� existe(m) outro(s) internamento(s) marcado(s) para os mesmos dias." + mensagem_relacionada_com_hora_saida);
//                                    }
//                                }
//                            }
//                           
//
//
//                            if (sub_accao != null && sub_accao.equals("sexta") || sub_accao.equals("setima")) {
//                                String quarto_hospital = (String) request.getParameter("quarto_hospital");
//                                if (quarto_hospital.equals("")) {
//                                    tabela_de_erros.put("quarto_hospital", "Tem de escolher um quarto.");
//                                }
//                                if (sub_accao != null && sub_accao.equals("setima")) {
//                                    String cama_disponivel = (String) request.getParameter("cama_disponivel");
//                                    if (cama_disponivel.equals("")) {
//                                        tabela_de_erros.put("cama_disponivel", "Tem de escolher uma cama.");
//                                    }
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }

        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaPagarServico(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

//        String tipo_pagamento = (String) request.getParameter("tipo_pagamento");
//        if (tipo_pagamento == null || tipo_pagamento.trim().equals("")) {
//            tabela_de_erros.put("tipo_pagamento", "Campo Obrigatório. Não pode estar vazio.");
//        } else if (!tipo_pagamento.equals("cartao") && !tipo_pagamento.equals("numerario") && !tipo_pagamento.equals("cheque")) {
//            tabela_de_erros.put("tipo_pagamento", "O Tipo de Pagamento deverá ser Cartão, Numerário ou Cheque");
//        }
//
//        if (!tabela_de_erros.contains("tipo_pagamento")) {
//            if (tipo_pagamento.equals("cheque")) {
//                String numero_de_cheque = (String) request.getParameter("numero_de_cheque");
//                if (numero_de_cheque == null || numero_de_cheque.trim().equals("")) {
//                    tabela_de_erros.put("numero_de_cheque", "Campo Obrigatório. Não pode estar vazio.");
//                } else if (!UtensiliosParaStrings.eUmNumero(numero_de_cheque)) {
//                    tabela_de_erros.put("numero_de_cheque", "O campo número de cheque deverá ser numérico.");
//                } else if (numero_de_cheque.length() != 31) {
//                    tabela_de_erros.put("numero_de_cheque", "Número de Cheque inválido. Deverá ter 31 caracteres, inclusive.");
//                }
//            } else if (tipo_pagamento.equals("cartao")) {
//                String tipo_de_cartao = (String) request.getParameter("tipo_de_cartao");
//                if (tipo_de_cartao == null || tipo_de_cartao.trim().equals("")) {
//                    tabela_de_erros.put("tipo_de_cartao", "Campo Obrigatório. Não pode estar vazio.");
//                } else if (!tipo_de_cartao.equals("VISA") && !tipo_de_cartao.equals("AmericanExpress") && !tipo_de_cartao.equals("MasterCard") && !tipo_de_cartao.equals("Outro")) {
//                    tabela_de_erros.put("tipo_de_cartao",
//                            "O Tipo de Cartão de Crédito deverá ser VISA, MasterCard, American Express ou outro tipo de cartão.");
//                }
//
//                String numero_de_cartao = (String) request.getParameter("numero_de_cartao");
//                if (numero_de_cartao == null || numero_de_cartao.trim().equals("")) {
//                    tabela_de_erros.put("numero_de_cartao", "Campo Obrigatório. Não pode estar vazio.");
//                } else if (!UtensiliosParaStrings.eUmNumero(numero_de_cartao)) {
//                    tabela_de_erros.put("numero_de_cartao", "O campo número de cartão deverá ser numérico.");
//                } else if (numero_de_cartao.length() < 7 || numero_de_cartao.length() > 19) {
//                    tabela_de_erros.put("numero_de_cartao", "Número de cartão inválido. Deverá ter entre 7 a 19 caracteres, inclusive.");
//                }
//
//                // Data de Validade
//                String data_de_validade_do_cartao_ano = (String) request.getParameter("data_de_validade_do_cartao_ano");
//                if (data_de_validade_do_cartao_ano == null || data_de_validade_do_cartao_ano.trim().equals("")) {
//                    tabela_de_erros.put("data_de_validade_do_cartao_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
//                } else if (!UtensiliosParaStrings.eUmNumero(data_de_validade_do_cartao_ano)) {
//                    tabela_de_erros.put("data_de_validade_do_cartao_ano", "O campo ano da data de validade deverá ser numérico.");
//                }
//
//                String data_de_validade_do_cartao_mes = (String) request.getParameter("data_de_validade_do_cartao_mes");
//                if (data_de_validade_do_cartao_mes == null || data_de_validade_do_cartao_mes.trim().equals("")) {
//                    tabela_de_erros.put("data_de_validade_do_cartao_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
//                } else if (!UtensiliosParaStrings.eUmNumero(data_de_validade_do_cartao_mes)) {
//                    tabela_de_erros.put("data_de_validade_do_cartao_mes", "O campo mês da data de validade deverá ser numérico.");
//                }
//
//                String data_de_validade_do_cartao_dia = (String) request.getParameter("data_de_validade_do_cartao_dia");
//                if (data_de_validade_do_cartao_dia == null || data_de_validade_do_cartao_dia.trim().equals("")) {
//                    tabela_de_erros.put("data_de_validade_do_cartao_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
//                } else if (!UtensiliosParaStrings.eUmNumero(data_de_validade_do_cartao_dia)) {
//                    tabela_de_erros.put("data_de_validade_do_cartao_dia", "O campo dia da data de validade deverá ser numérico.");
//                }
//
//                if (data_de_validade_do_cartao_ano != null && !data_de_validade_do_cartao_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_validade_do_cartao_ano) && data_de_validade_do_cartao_mes != null && !data_de_validade_do_cartao_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_validade_do_cartao_mes) && data_de_validade_do_cartao_dia != null && !data_de_validade_do_cartao_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_validade_do_cartao_dia)) {
//                    int ano = Integer.parseInt(data_de_validade_do_cartao_ano);
//                    int mes = Integer.parseInt(data_de_validade_do_cartao_mes);
//                    int dia = Integer.parseInt(data_de_validade_do_cartao_dia);
//                    if (!UtensiliosParaDatas.eValida(ano, mes, dia)) {
//                        tabela_de_erros.put("data_de_validade_do_cartao", "Formato de Data Errado.");
//                    } else if (UtensiliosParaDatas.eMaiorDoQue(UtensiliosParaDatas.agora(), UtensiliosParaDatas.devolveData(ano, mes, dia))) {
//                        tabela_de_erros.put("data_de_validade_do_cartao_contrato", "Data de validade inferior à  própria data actual.");
//                    }
//                }
//            }
//        }
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosInserirFichaMedica(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

        String sintoma = (String) request.getParameter("sintomas");
        if (sintoma == null || sintoma.trim().equals("")) {
            tabela_de_erros.put("sintomas", "Campo Obrigatório. Não pode estar vazio.");
        }

        String diagnostico = (String) request.getParameter("diagnostico");
        if (diagnostico == null || diagnostico.trim().equals("")) {
            tabela_de_erros.put("diagnostico", "Campo Obrigatório. Não pode estar vazio.");
        }

        String observacao_publica = (String) request.getParameter("observacoes_publicas");
        if (observacao_publica == null || observacao_publica.trim().equals("")) {
            tabela_de_erros.put("observacoes_publicas", "Campo Obrigatório. Não pode estar vazio.");
        }

        return tabela_de_erros;
    }

    private Hashtable<String, Object> populaTabelaPagarServico(final HttpServletRequest request) {
        Hashtable<String, Object> dados = new Hashtable<String, Object>();

        String tipo_pagamento = (String) request.getParameter("tipo_pagamento");
        dados.put("var_tipo_pagamento", tipo_pagamento);

        dados.put("var_numero_de_cheque", "null");
        dados.put("var_tipo_de_cartao", "null");
        dados.put("var_numero_de_cartao", "null");
        dados.put("var_data_de_validade_do_cartao", "null");

        if (tipo_pagamento.equals("cheque")) { // Numero
            String numero_de_cheque = (String) request.getParameter("numero_de_cheque");
            dados.put("var_numero_de_cheque", "'" + numero_de_cheque + "'");
        } else if (tipo_pagamento.equals("cartao")) { // Tipo/Numero/Data
            String tipo_de_cartao = (String) request.getParameter("tipo_de_cartao");
            dados.put("var_tipo_de_cartao", "'" + tipo_de_cartao + "'");

            String numero_de_cartao = (String) request.getParameter("numero_de_cartao");
            dados.put("var_numero_de_cartao", "'" + numero_de_cartao + "'");

            String data_de_validade_do_cartao_ano = (String) request.getParameter("data_de_validade_do_cartao_ano");
            String data_de_validade_do_cartao_mes = (String) request.getParameter("data_de_validade_do_cartao_mes");
            String data_de_validade_do_cartao_dia = (String) request.getParameter("data_de_validade_do_cartao_dia");
            int ano = Integer.parseInt(data_de_validade_do_cartao_ano);
            int mes = Integer.parseInt(data_de_validade_do_cartao_mes);
            int dia = Integer.parseInt(data_de_validade_do_cartao_dia);
            dados.put("var_data_de_validade_do_cartao", "'" + UtensiliosParaDatas.devolveDataEmString(ano, mes, dia) + "'");
        }
        return dados;
    }

    private Consulta populaTabelaMarcarConsulta(final HttpServletRequest request, final HttpSession session) throws Exception {

        String especialidade_final = request.getParameter("especialidade").toString().replace(' ', '_');

        // Id Utente
        Long id_utente = Long.parseLong((String) session.getAttribute("id_pessoa_selecionada"));
        session.removeAttribute("id_pessoa_selecionada");

        // Hospital (id_hospital)
        Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));

        // Data
        Date data_actual = (Date) session.getAttribute("data_actual");
        int ano = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_actual));
        int mes = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual));
        int dia = Integer.parseInt(request.getParameter("dia"));
        int hora = Integer.parseInt(request.getParameter("hora"));
        String data_de_marcacao = UtensiliosParaDatas.devolveDataEHoraEmString(ano, mes + 1, dia, hora, 0);

        // Medico
        Long id_medico = Long.parseLong(request.getParameter("id_medico"));


        //String especialidade, String estado, String data, Double preco,
        //Long id_medico, Long id_pessoa, Long id_hospital
        Consulta cons = new Consulta(especialidade_final, "activa", data_de_marcacao, new Double(100), id_medico, id_utente, id_hospital);

        return cons;
    }

//    private Exame populaTabelaMarcarExame(final HttpServletRequest request, final HttpSession session) throws SQLException,
//            ClassNotFoundException, InstantiationException, IllegalAccessException {
//
//
//        Hashtable<String, Object> dados = new Hashtable<String, Object>();
//
//        // Servico Generico (id_servico_generico)
//        String tipo = "exame";
//
//        String especialidade_final = request.getParameter("especialidade").toString();
//
//        String especialidade = especialidade_final.replace(' ', '_');
//        ServicoGenerico servico_generico = ServicoGenerico.devolve(tipo, especialidade);
//
//        // Comparticipacao
//        double comparticipacao = 0;
//
//        Long id_utente = Long.parseLong((String) session.getAttribute("id_utente"));
//        Long id_medico = Long.parseLong((String) session.getAttribute("id_medico"));
//
//        dados.put("var_preco", servico_generico.getPreco());
//        dados.put("var_percentagem", comparticipacao);
//        dados.put("var_id_servico_generico", servico_generico.getIdServicoGenerico());
//        dados.put("var_id_colaborador", id_medico);
//        dados.put("var_id_utente", id_utente);
//
//
//        return new Exame(id_medico, id_medico, tipo, Long.MIN_VALUE, comparticipacao);
//
//
//        //return dados;
//
//    }

//    private Exame populaTabelaMarcarExameUtente(final HttpServletRequest request, final HttpSession session) throws SQLException,
//            ClassNotFoundException, InstantiationException, IllegalAccessException {
//
//        //Hashtable<String, Object> dados = new Hashtable<String, Object>();
//
//
//        Long id_servico_prestado = Long.parseLong(session.getAttribute("id_servico").toString());
//        Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));
//
//        // Data
//        Date data_actual = (Date) session.getAttribute("data_actual");
//        int ano = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_actual));
//        int mes = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_actual));
//        int dia = Integer.parseInt(request.getParameter("dia"));
//        int hora = Integer.parseInt(request.getParameter("hora"));
//        String data_de_marcacao = UtensiliosParaDatas.devolveDataEHoraEmString(ano, mes + 1, dia, hora, 0);
//
//        // Medico
//        Long id_medico = Long.parseLong(request.getParameter("id_medico"));
//        Long id_utente = Long.parseLong(request.getParameter("id_utente"));
//
//        String espec = request.getParameter("especialidade");
//
//        // Guardar para a hashtable
////        dados.put("var_id_servico_prestado", id_servico_prestado);
////        dados.put("var_data", data_de_marcacao);
////
////        dados.put("var_id_hospital", id_hospital);
////        dados.put("var_id_medico", id_medico);
////
////        return dados;
//
//        return new Exame(id_medico, id_utente, id_hospital, id_servico_prestado, espec, new Long(0), new Long(0), data_de_marcacao);
//
//    }

    private Hashtable<String, Object> populaTabelaConsultaExame(final HttpServletRequest request, final HttpSession session) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, Object> dados = new Hashtable<String, Object>();
        int id_consulta = Integer.parseInt(session.getAttribute("id_consulta").toString());

        dados.put("var_id_consulta", id_consulta);

        return dados;





    }

 
    private Hashtable<String, Object> populaTabelaInternamentoCliente(final HttpServletRequest request, final HttpSession session) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, Object> dados = new Hashtable<String, Object>();
//
//        String id_tipo = (String) session.getAttribute("tipo_de_internamento");
//        LinkedList<String> lista_id_internamento = Hospital.devolveIdInternamentoPorNome(id_tipo);
//        int id_tipo_internamento = Integer.parseInt(lista_id_internamento.getFirst());
//
//        //Pessoa � o utente
//        Pessoa pessoa = (Pessoa) session.getAttribute("pessoa");
//        int id_pessoa = pessoa.getIdPessoa();
//
//        //numero de colaborador do medico
//        Medico colaborador = (Medico) session.getAttribute("utilizador");
//        int numero_colaborador = colaborador.getNumeroDeColaborador();
//
//        int numero_quarto = Integer.parseInt((String) session.getAttribute("quarto_hospital"));
//        int numero_cama = Integer.parseInt((String) session.getAttribute("cama_escolhida"));
//
//
//        Date data_entrada = (Date) session.getAttribute("data_actual_entrada");
//        Date data_saida = (Date) session.getAttribute("data_actual_saida");
//
//        //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
//        int ano_entrada = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_entrada));
//        int mes_entrada = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_entrada));
//        int dia_entrada = Integer.parseInt((String) session.getAttribute("dia_inicio"));
//        String nova_data_entrada = ("" + ano_entrada + "-" + (mes_entrada + 1) + "-" + dia_entrada + "");
//
//        //O mes do calendario come�a em 0, logo na inser��o tem de se somar 1 ao mes
//        int ano_saida = Integer.parseInt(UtensiliosParaDatas.devolveAnoDaData(data_saida));
//        int mes_saida = Integer.parseInt(UtensiliosParaDatas.devolveMesDaData(data_saida));
//        int dia_saida = Integer.parseInt((String) session.getAttribute("dia_fim"));
//        String nova_data_saida = ("" + ano_saida + "-" + (mes_saida + 1) + "-" + dia_saida + "");
//
//        
//        int hora_entrada = Integer.parseInt( (String) session.getAttribute("hora_entrada") );
//        int hora_saida = Integer.parseInt( (String) session.getAttribute("hora_saida") );
//       
//
//        // Guardar para a hashtable
//        dados.put("var_id_tipo_internamento", id_tipo_internamento);
//        dados.put("var_id_pessoa", id_pessoa);
//        dados.put("var_numero_colaborador", numero_colaborador);
//        dados.put("var_numero_quarto", numero_quarto);
//        dados.put("var_numero_cama", numero_cama);
//        dados.put("var_nova_data_entrada", nova_data_entrada);
//        dados.put("var_nova_data_saida", nova_data_saida);
//
//        
//        dados.put("var_hora_entrada", hora_entrada);
//        dados.put("var_hora_saida", hora_saida);
//      

        return dados;
    }
    public static final String MARCAR_CONSULTA = "marcar_consulta";
    public static final String SOLICITAR_INTERNAMENTO = "solicitar_internamento";
    public static final String ALTERAR_INTERNAMENTO = "alterar_internamento";
    public static final String MARCAR_FALTA_DE_COMPARENCIA_DE_CONSULTA = "concluir_por_falta";
    public static final String MARCAR_COMPARENCIA_DE_CONSULTA = "concluir_por_comparencia";
    public static final String CANCELAR_CONSULTAS = "cancelar_consulta";
    public static final String PAGAR_SERVICO = "pagar_servico";
    public static final String EMITIR_FACTURA = "emitir_factura";
    public static final String VISUALIZAR_CONSULTAS = "visualizar_consultas";
    public static final String VISUALIZAR_HISTORIAL_MEDICO = "visualizar_historial_medico";
    public static final String VISUALIZAR_CONSULTAS_DO_COLABORADOR = "visualizar_consultas_do_colaborador";
    public static final String VISUALIZAR_FICHA_MEDICA = "visualizar_ficha_medica";
    public static final String INSERIR_FICHA_MEDICA = "inserir_ficha_medica";
    public static final String ALTERAR_FICHA_MEDICA = "alterar_ficha_medica";
    public static final String MARCAR_EXAME_MEDICO = "marcar_exame_medico";
    public static final String EXAMES_MARCADOS = "exames_marcados";
    public static final String EXAMES_MARCADOS_UTENTE = "exames_marcados_utente";
    public static final String MARCAR_EXAME = "marcar_exame";
}
